2012-12-23 2 views
0

저는 현재 3ds/gmax의 쿼터니언 추가를 모방 한 함수가 필요합니다. (quat 1 2 3 4) + (quat 3 5 7 9)의 테스트 케이스는 같아야합니다 (quat 20 40 54 2). 이 퀘스트는 xyzw입니다. 그래서 깨끗한 숫자가 주어지면 기본 대수학이라고 생각합니다. V의 *의 QV입니다 - 내가 * QS 방법 SN = S 이해하지 못하고,3ds/gmax와 같은 쿼터니언 추가 기능은 quats와 함께 수행됩니다.

const quaternion &operator *=(const quaternion &q)  
    { 
     float x= v.x, y= v.y, z= v.z, sn= s*q.s - v*q.v; 
     v.x= y*q.v.z - z*q.v.y + s*q.v.x + x*q.s; 
     v.y= z*q.v.x - x*q.v.z + s*q.v.y + y*q.s; 
     v.z= x*q.v.y - y*q.v.x + s*q.v.z + z*q.s; 
     s= sn; 
     return *this; 
    } 

source

을하지만 :이 죄/COS를 포함하지 않기 때문에,이 곱셈 기능과 같이있을거야 일해야한다. s는 float, v는 벡터입니다. 벡터를 곱하고 플로트에 추가 하시겠습니까? 위의 값이 나타내는 방향/회전/방향의 조건이 확실치 않지만 함수가 위의 quat 값을 충족하면 작동합니다.

답변

0

발견. 곱셈이라고합니다. 덧셈은 곱셈입니다. 위로는 옆으로. 전혀 혼동하지 :/

fn qAdd q1 q2 = (
x1=q1.x 
y1=q1.y 
z1=q1.z 
w1=q1.w 
x2=q2.x 
y2=q2.y 
z2=q2.z 
w2=q2.w 

W = (W1 * W2) - (X1 * X2) - (Y1 * Y2) - (Z1 * Z2) 
X = (W1 * X2) + (X1 * W2) + (Y1 * Z2) - (Z1 * Y2) 
Y = (W1 * Y2) + (Y1 * W2) + (Z1 * X2) - (X1 * Z2) 
Z = (W1 * Z2) + (Z1 * W2) + (X1 * Y2) - (Y1 * X2) 

return (quat x y z w) 

)

1 분기 & 2 분기 수익률 다른 결과가 꽤 같은 추가도 곱셈도 스와핑. 당신이 (쿼터니언의 주요 사용되는) 회전 "을 추가"하려면

source

+0

는, 당신은 자신의 사원 수의 표현을 곱해야합니다. 객체에 두 가지 다른 회전을 적용하면 최종 결과는 순서에 따라 다릅니다. 그래서 주문을 교환하는 것이 효과적입니다. – JCooper