将四元数完全旋转为矢量

本文关键字:旋转 四元数 | 更新日期: 2023-09-27 18:02:29

我有两个对象(目标和玩家),都有位置(Vector3)和旋转(四元数)。我想让目标旋转并且正对着玩家。当目标射击时,它应该瞄准玩家。

我已经看到了很多玩家睡觉的例子,但我不想要增量旋转,我想只要我能让睡眠是100%,只要它确实有效,那就可以了。

仅供参考-我可以使用位置和旋转做很多其他事情,它都很好,除了这最后一块我不明白。

编辑

代码示例在Target的类中运行,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);

将四元数完全旋转为矢量

我已经有一段时间没有做这种计算了,但是我已经猜到第三个参数应该是1。

编辑:为了证明这一点,上次我这样做的时候,它被称为Managed directX,而不是XNA!

我碰巧在游戏开发堆栈交流中问了同样的问题,那里有人回答了。请务必阅读答案中的评论,无论如何,答案/解决方案都非常有效!谢谢,也很抱歉在这里问。

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