У меня есть два объекта (цель и игрок), оба имеют Положение (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);