【问题标题】:Fully Rotate a Quaternion to a Vector将四元数完全旋转为向量
【发布时间】: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);

【问题讨论】:

    标签: c# 3d xna


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

      我碰巧在 Game Dev stack exchange 中问过同样的问题,那里有人回答了。确保阅读答案中的 cmets,无论如何,答案/解决方案效果很好!谢谢,也很抱歉在这里问。

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

      【讨论】:

        猜你喜欢
        • 2013-03-30
        • 2012-06-11
        • 2015-01-13
        • 2010-12-06
        • 1970-01-01
        • 2021-03-07
        • 2023-04-06
        • 2014-03-12
        • 1970-01-01
        相关资源
        最近更新 更多