У меня есть два объекта (цель и игрок), оба имеют Положение (Vector3) и Вращение (Quaternion). Я хочу, чтобы цель вращалась и смотрела прямо на игрока. Цель, когда она стреляет, должна стрелять прямо в игрока.
Я видел множество примеров slerping к игроку, но я не хочу инкрементного вращения, ну, я полагаю, это будет нормально, если я могу сделать slerp 100%, и до тех пор, пока он действительно работает.
К вашему сведению - я могу использовать положение и вращение, чтобы делать много других вещей, и все это прекрасно работает, кроме этой последней части, которую я не могу понять.
Примеры кода выполняются в классе цели, позиция = позиция цели, аватар = игрок.
РЕДАКТИРОВАТЬ
Сейчас я использую предоставленный им код Майка c #, и он отлично работает!
0*(rotation A) + 1*(rotation B)
- другими словами, вы просто устанавливаете вращение на B долгое время. Slerp предназначен только для определения того, как должно выглядеть вращение (0% <x <100%) пути между ними.Ответы:
Есть несколько способов сделать это. Вы можете рассчитать абсолютную ориентацию или поворот относительно вашего аватара, что означает вашу новую ориентацию = avatarOrientation * q. Вот последний:
Рассчитайте ось вращения, взяв перекрестное произведение вектора единицы вперед вашего аватара и вектора единицы от аватара к цели, нового вектора вперед:
Рассчитать угол поворота с помощью точечного произведения
Создайте кватернион, используя rotAxis и rotAngle, и умножьте его на текущую ориентацию аватара.
Если вам нужна помощь в поиске текущего вектора прямого аватара, введите 1. Просто стреляйте :)
РЕДАКТИРОВАТЬ: Расчет абсолютной ориентации на самом деле немного проще, используйте прямой вектор единичной матрицы вместо прямого вектора аватаров в качестве входных данных для 1) и 2). И не умножайте это в 3), вместо этого используйте это непосредственно как новую ориентацию:
newRot = q
Важно отметить: решение имеет 2 аномалии, вызванные характером перекрестного продукта:
Если прямые векторы равны. Решение здесь - просто вернуть кватернион
Если векторы указывают точно в противоположном направлении. Решение здесь состоит в том, чтобы создать кватернион, используя аватары вверх по оси в качестве оси вращения и угол 180.0 градусов.
Вот реализация в C ++, которая заботится об этих крайних случаях. Преобразовать его в C # должно быть легко.
РЕДАКТИРОВАТЬ: исправленная версия кода XNA Марка
источник
newForward
rotAngle
rotAxis
иreturned quaternion
. Код для моба будет таким же, как только мы заставим его работать с аватаром, будет легко изменить заголовок любого объекта.