使用四元数的向量长度

Length of vector using quaternions

是否可以通过将矢量旋转到一个轴并沿该轴旋转来计算矢量的长度,然后使用该轴来测量矢量的长度?如果是的话,是不是比用Pythagoras/square-root计算长度便宜? 我正在统一工作 (C#)

示例:

Vector3 myVector(x, y, z);
Vector3 myVectorRealigned = Quaternion.FromToRotation(myVector, Vector3.up) * myVector;

float myVectorLength1 = sqrt(myVector.x^2 + myVector.y^2 + myVector.z^2);
float myVectorLength2 = myVectorRealigned.y;

当我尝试这个时,它似乎有效!然而,这些方法中哪种方法最好 use/is 最便宜?

我不是数学家,如有错误请指正

正如您所测试的,这两种方法都应该有效,但我猜四元数方法的成本更高。

范数方法需要 3 次乘法、2 次加法和 1 次平方。

相比之下,仅四元数方法 (Quaternion.FromToRotation) 的第一步就比计算范数的成本更高。一种计算描述从一个向量到另一个向量的旋转的四元数的方法是这样的:

Quaternion q;
vector a = crossproduct(v1, v2)
q.xyz = a;
q.w = sqrt((v1.Length ^ 2) * (v2.Length ^ 2)) + dotproduct(v1, v2)

如您所见,仅此一项就比 norm = sqrt(myVector.x^2 + myVector.y^2 + myVector.z^2) 贵。

此外,您还使用该四元数来旋转您的向量,再次涉及点积、叉积以及一些乘法和加法。

例如:rotatedVec = 2 * dot(q.xyz, v) * q.xyz + (q.w^2 - dot(q.xyz, q.xyz)) * v + 2 * q.w * cross(q.xyz, v).

参考文献:from-to-quaternion, rotate vector by quaternion

旁注:如果您关心性能并且不需要矢量的确切长度(例如,确定离位置 x 最近的对象),您可以也使用 Vector3.sqrMagnitude(平方范数)。