我试图看看它的功能是否有效,并且我取得了一些成功:
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并转换为四元数。
答案 0 :(得分:2)
这种操作更适合用矩阵执行 Calculating a LookAt matrix
转换回四元数。
如果你想用四元数来执行它,可以使用2次调用“http://lolengine.net/blog/2013/09/18/beautiful-maths-quaternion-from-vectors
的”shortest_arc“来完成它首先通过DIR矢量调用旋转,然后通过第二次调用来补偿从旋转的向上矢量滚动到所需的“向上”。