C# 使用四元数的向量长度

C# 使用四元数的向量长度,c#,optimization,unity3d,quaternions,C#,Optimization,Unity3d,Quaternions,是否可以通过将向量旋转到轴上并沿轴旋转来计算向量的长度,然后使用该轴测量向量的长度?如果是这样,它是否比用毕达哥拉斯/平方根计算长度便宜? 我在团结工会工作(C#) 例如: Vector3 myVector(x, y, z); Vector3 myVectorRealigned = Quaternion.FromToRotation(myVector, Vector3.up) * myVector; float myVectorLength1 = sqrt(myVector.x^2 + myV

是否可以通过将向量旋转到轴上并沿轴旋转来计算向量的长度,然后使用该轴测量向量的长度?如果是这样,它是否比用毕达哥拉斯/平方根计算长度便宜? 我在团结工会工作(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;

当我试着这样做时,它似乎起了作用!但是,这些方法中哪一种最好用/哪一种最便宜?

我不是数学家,如果我错了,请纠正我

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

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

相比之下,四元数方法的第一步(
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*点(q.xyz,v)*q.xyz+(q.w^2-点(q.xyz,q.xyz))*v+2*q.w*交叉(q.xyz,v)

参考文献:


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

我不是数学家,如果我错了,请纠正我

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

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

相比之下,四元数方法的第一步(
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*点(q.xyz,v)*q.xyz+(q.w^2-点(q.xyz,q.xyz))*v+2*q.w*交叉(q.xyz,v)

参考文献:


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

如果您使用visual studio,它有一个内置的探查器。它可以让你衡量两者的性能。我建议@BrandonIbbotson所说的,但我可以想象范数会更快,因为四元数计算也需要sqrt,旋转涉及的乘法比范数多得多。为了性能,有时最好不要sqrt平方和。当你想比较距离时,通过旋转计算向量长度是一个完全不好的主意,因为你要计算三个分量,其中两个分量为零。不包括获得旋转的事实,你需要范数和更多。如果你使用的是visual studio,它有一个内置的分析器。它可以让你衡量两者的性能。我建议@BrandonIbbotson所说的,但我可以想象范数会更快,因为四元数计算也需要sqrt,旋转涉及的乘法比范数多得多。为了性能,有时最好不要sqrt平方和。当你想比较距离时,通过旋转计算向量长度是一个完全不好的主意,因为你要计算三个分量,其中两个分量为零。不算获得旋转的事实,你需要范数和更多。