Полностью повернуть кватернион к вектору - PullRequest
0 голосов
/ 20 июля 2011

У меня есть два объекта (цель и игрок), оба имеют Положение (Vector3) и Вращение (Quaternion).Я хочу, чтобы цель вращалась и смотрела прямо на игрока.Цель, когда она стреляет, должна стрелять прямо в игрока.

Я видел множество примеров сперлинга для игрока, но я не хочу инкрементного вращения, ну, я полагаю, что все будет в порядке, пока я могу сделать сперлинг 100%, и какПока это действительно работает.

К вашему сведению - я могу использовать положение и вращение, чтобы делать множество других вещей, и все это прекрасно работает, кроме этой последней части, которую я не могу понять.

EDIT

Примеры кода выполняются в классе цели, Position = позиция цели, Avatar = игрок.

Использование значения 1 для Slerp не работает.Приведенный ниже код несколько поворачивает, но я думаю, что что-то не так, потому что, когда он нарисован, цель масштабируется, а затем уменьшается, когда игрок приближается.

var A = new Vector3(Position.X, Position.Y, Position.Z);
var B = new Vector3(GameState.Avatar.Position.X, GameState.Avatar.Position.Y, GameState.Avatar.Position.Z);
A.Normalize();
B.Normalize();
var angle = Math.Acos(Vector3.Dot(A, B));
var axis = Vector3.Normalize(Vector3.Cross(A, B));
var rotOnAngle = new Quaternion(axis, (float)angle);
var newRot = Quaternion.Slerp(Quaternion.Identity, rotOnAngle, 1f);
Rotation = newRot;
Cannon.Shoot(Position, Rotation, this);

Я пытался использовать это, и это не совсем работаетлибо ... цель вращается, но не лицом к игроку.Но, по крайней мере, проблема масштабирования исчезнет.

Quaternion q = new Quaternion();
var pos = Vector3.Normalize(Position);
var pos2 = Vector3.Normalize(GameState.Avatar.Position);%
var a = Vector3.Cross(Position, GameState.Avatar.Position);
q.X = a.X; q.Y = a.Y; q.Z = a.Z;
q.W = (float)Math.Sqrt(((int)Position.Length() ^ 2) * ((int)GameState.Avatar.Position.Length() ^ 2)) + Vector3.Dot(Position, GameState.Avatar.Position);
q.Normalize();
Rotation = q;
Cannon.Shoot(Position, Rotation, this);

Ответы [ 2 ]

0 голосов
/ 02 сентября 2011

Я случайно задал тот же вопрос в стеке Game Dev, и кто-то ответил там.Обязательно прочитайте комментарии в ответе, независимо от того, ответ / решение отлично работает!Спасибо, и извините за вопрос здесь.

https://gamedev.stackexchange.com/questions/15070/orienting-a-model-to-face-a-target

0 голосов
/ 20 июля 2011

Прошло много времени с тех пор, как я сделал такую ​​математику, но я бы предположил, что 3-й параметр будет просто 1.

Редактировать: Чтобы это квалифицировать, в последний раз, когда я это делал, он назывался Managed directX, а не XNA!

...