Как нормализуются векторы при программировании игр
Я был достаточно неудачен, чтобы посещать среднюю школу, которая не заботилась о подготовке студентов к колледжу, но я изучаю программирование игр и все программирование, которое я получаю, но я прохожу курс Game AI, и мы изучаем FSM и движения ИИ, и я столкнулся с "нормализацией", изучил это, и это вроде как имеет смысл, но как бы я использовал это в программировании игры? Может быть, я просто не очень хорошо понимаю эту концепцию (никогда не брал уроки алгебры, хотя каждый день использую математику более высокого уровня в других программах, однако учусь по ходу дела), но я просто не понимаю, зачем мне это нужно сделать это.
1 ответ
Векторы представляют как длину, так и направление. Иногда для умножения удобно использовать "единичный вектор" (с длиной один), потому что легко контролировать длину результата.
Умножьте вес в один фунт на пять, и что у вас будет? Вес пять фунтов.
Умножьте единичный вектор на пять, и что у вас получится? Вектор, указывающий пять единиц в этом направлении.
В качестве практического примера, скажем, я пишу систему камер для простой игры: две машины мчатся друг против друга по прямой. Камера должна вращаться вокруг машины игрока, смотря в направлении противника.
Поскольку вы пометили вопрос с помощью unity3d, я предложу код C#, который будет компилироваться в Unity3D. Однако основные понятия одинаковы для любого использования.
Давайте предположим, что нам дали два балла:
Vector3 playerPos, enemyPos;
Некоторые операции мы могли бы найти полезными:
//find separation between two points
Vector3 playerToEnemy = enemyPos - playerPos;
//find distance between them
float distance = playerToEnemy.magnitude;
//find direction of separation
Vector3 enemyDirection = playerToEnemy.normalized;
Наконец, мы позиционируем камеру:
Vector3 camPos = playerPos; //start at player's position
camPos -= enemyDirection * 10f; //move ten units away from enemy
camPos += Vector3.up * 5f; //move five units up
Transform tr = Camera.main.transform;
tr.position = camPos;
tr.LookAt(enemyPos);
Вы можете заметить, что я использовал один из встроенных векторов Unity3D (включая Vector3.up
, Vector3.right
, а также Vector3.forward
). Каждый объект преобразования в Unity также имеет эквиваленты в локальном пространстве.
Другое использование: с векторными точечными произведениями вы можете проверить, указывают ли два нормализованных вектора в одинаковых направлениях, потому что выходное значение точечного произведения будет варьироваться от -1 (противоположные направления) до 0 (перпендикулярно) до 1 (параллельно).