【发布时间】:2011-10-08 21:39:11
【问题描述】:
我有两个对象(目标和玩家),都有位置(Vector3)和旋转(四元数)。我希望目标旋转并正对着玩家。目标在射击时应该向玩家射击。
我已经看到了很多向玩家展示 slerp 的例子,但我不想要增量轮换,好吧,我想只要我可以让 slerp 达到 100% 就可以了,只要它确实有效。
仅供参考 - 我可以使用位置和旋转来做很多其他事情,除了最后一件我无法弄清楚之外,这一切都很好。
编辑
代码示例在 Target 的类中运行,Position = 目标位置,Avatar = 玩家。
对 Slerp 使用值 1 是行不通的。下面的这段代码旋转了一些,但我认为有些东西在绘制时会随着玩家的靠近而放大然后缩小。
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);
【问题讨论】: