Как нормализуются векторы при программировании игр

Я был достаточно неудачен, чтобы посещать среднюю школу, которая не заботилась о подготовке студентов к колледжу, но я изучаю программирование игр и все программирование, которое я получаю, но я прохожу курс 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 (параллельно).

Другие вопросы по тегам