使用四元数的传染媒介的长度

时间:2017-01-03 08:36:12

标签: c# optimization unity3d quaternions

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

当我尝试这个似乎工作!但是哪种方法最好用/最便宜?

1 个答案:

答案 0 :(得分:3)

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

正如您所测试的那样,两种方法都应该有效,但我认为Quaternion方法的成本更高。

规范方法需要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 * dot(q.xyz, v) * q.xyz + (q.w^2 - dot(q.xyz, q.xyz)) * v + 2 * q.w * cross(q.xyz, v)

参考文献:from-to-quaternionrotate vector by quaternion

旁注:如果您关注性能并且不需要矢量的确切长度(例如,用于确定最接近x的位置),则可以使用{{3} (方形规范)也是如此。