2017-01-03 3 views
0

벡터의 길이를 축으로 그리고 축을 따라 회전시켜 계산할 수 있습니까? 그리고 축을 사용하여 벡터의 길이를 측정 할 수 있습니까? 그렇다면 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; 

! 그러나이 방법들 중 어느 것을 사용하는 것이 가장 좋습니다/가장 적은 비용입니까?

+1

Visual Studio를 사용하는 경우 프로파일 러가 내장되어 있습니다. 그것은 당신이 두 사람의 성과를 측정하게 할 것입니다. – byxor

+0

@BrandonIbbotson이 말한 것을 제안하지만 Quaternion 계산에는 sqrt가 필요하고 회전에는 표준보다 훨씬 많은 곱셈이 필요하기 때문에 규범이 더 빠를 것이라고 상상할 수 있습니다. 성능을 위해 – TheDjentleman

+1

을 사용하십시오. 때로는 제곱의 합을 sqrt하지 않는 것이 좋습니다. 거리를 비교할 때처럼. – Bijan

답변

2

저는 수학자가 아니므로 제 잘못 생각해주세요.

테스트를 마쳤으므로 두 접근법 모두 작동해야하지만 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-quaternion, rotate vector by quaternion

사이드 참고 :이 성능에 관심을 당신이 (x 위치에 가장 가까운 개체를 결정하는 등) 정확한 벡터의 길이를 필요로하지 않는 경우, 당신이 할 수있는 Vector3.sqrMagnitude (표준 제곱)도 사용하십시오.