我有两个对象(目标和玩家),都有Position(Vector3)和Rotation(Quaternion)。我希望目标旋转并朝向玩家。目标,当它射击的东西应该向玩家射击。
我已经看过很多关于对玩家进行拼抢的例子,但我不想要增量旋转,好吧,我想只要我能让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);
答案 0 :(得分:0)
自从我做了这种数学运算已经有一段时间了,但我猜想那里的第3个参数就是1。
编辑:为了证明这一点,我最后一次这样做,它被称为Managed directX,而不是XNA!
答案 1 :(得分:0)
我碰巧在Game Dev堆栈交换中问了同样的问题,有人在那里回答。无论如何,请务必阅读答案中的评论,答案/解决方案效果很好!谢谢,也很抱歉在这里问。
https://gamedev.stackexchange.com/questions/15070/orienting-a-model-to-face-a-target