处理四元数“LookAt”功能 - 保持角色直立

时间:2014-07-03 23:05:06

标签: rotation axis angle quaternions opentk

我试图看看它的功能是否有效,并且我取得了一些成功:

    public virtual void LookAt(Vector3 point)
    {
        Vector3 fw = Forward;
        Vector3 delta = (point - Position).Normalized();
        if (delta.LengthSquared > 0)
        {
            Vector3 axis = Vector3.Cross(delta, fw);
            float angle = Vector3.CalculateAngle(delta, fw);
            if (angle > 0)
            {
                angle *= -Math.Sign(Vector3.Dot(Vector3.Cross(axis, fw), delta));
                Rotation *= Quaternion.FromAxisAngle(axis.Normalized(), angle);
            }
        }
    }

这有效,但它无法考虑我不想要任何滚动。所以方向是正确的,但我需要修理相机的滚动。现在,我知道我可以通过从AxisAngle创建一个四元数来旋转它,但我不知道如何获得当前和直立位置之间的角度!?

编辑:立即使用matrix.lookAt并转换为四元数。

1 个答案:

答案 0 :(得分:2)

这种操作更适合用矩阵执行 Calculating a LookAt matrix

转换回四元数。

如果你想用四元数来执行它,可以使用2次调用“http://lolengine.net/blog/2013/09/18/beautiful-maths-quaternion-from-vectors

的”shortest_arc“来完成它

首先通过DIR矢量调用旋转,然后通过第二次调用来补偿从旋转的向上矢量滚动到所需的“向上”。