2012-03-20 2 views
1

저는 3D 공간에서 물체의 방향으로 문자를 회전 할 수 있도록 두 벡터 사이의 각도를 계산하려고합니다. 두 벡터 (문자 & 개체), loc_look 및 modelPos 있습니다. 단순함을 위해서 저는 단지 위로 축을 따라 회전하려고합니다 ... 요. loc_look = D3DXVECTOR3 (0, 0, 1), modelPos = D3DXVECTOR3 (0, 0, 15);도트 곱을 사용하여 두 벡터 사이의 각도 계산

올바른 계산으로 보이는이 코드를 작성했습니다. 캐릭터의 룩업 벡터 (loc_look)에 적용되는 회전이 오브젝트의 위치 (modelPos) 값을 초과하므로 내 문제가 발생합니다. 문자 개체를 직면하게 될 것이다, 그래서

또한
void CEntity::CalculateOrientationMatrix(D3DXMATRIX *orientationMatrix) 

{  

D3DXMatrixRotationAxis(&rotY, &loc_up, loc_yaw); 

D3DXVec3TransformCoord(&loc_look, &loc_look, &rotY); 

D3DXVec3TransformCoord(&loc_right, &loc_right, &rotY); 


D3DXMatrixRotationAxis(&rotX, &loc_right, loc_pitch); 

D3DXVec3TransformCoord(&loc_look, &loc_look, &rotX); 

D3DXVec3TransformCoord(&loc_up, &loc_up, &rotX); 


D3DXMatrixRotationAxis(&rotZ, &loc_look, loc_roll);  

D3DXVec3TransformCoord(&loc_up, &loc_up, &rotZ); 

D3DXVec3TransformCoord(&loc_right, &loc_right, &rotZ); 

*orientationMatrix *= rotX * rotY * rotZ; 


orientationMatrix->_41 = loc_position.x; 

orientationMatrix->_42 = loc_position.y; 

orientationMatrix->_43 = loc_position.z; 


//D3DXVec3Normalize(&loc_look, &loc_look); 

SetYawPitchRoll(0,0,0); // Reset Yaw, Pitch, & Roll Amounts 

} 

0.1로, 각 반복을 modelPos.x 증가 참고 :

BOOL CEntity::TARGET() 
{ 
    if(graphics.m_model->m_enemy) 
    { 
     D3DXVECTOR3 modelPos = graphics.m_model->position; 
     D3DXVec3Normalize(&modelPos, &modelPos); 

     //D3DXVec3Normalize(&loc_look, &loc_look); 
     float dot = D3DXVec3Dot(&loc_look, &modelPos); 
     float yaw = acos(dot); 
     BOOL neg = (loc_look.x > modelPos.x) ? true : false; 
     switch (neg) 
     { 
     case false: 
      Yaw(yaw); 
      return true; 
     case true: 
      Yaw(-yaw); 
      return true; 
     }   
    } 
    else 
     return false; 
} 

나는 다음과 같은 코드를 사용하여 문자의 방향 행렬을 회전 : 여기 내 코드입니다 x 축을 따라 움직이면 ... 이제 프로그램을 실행할 때 첫 번째 반복에서는 모든 것이 괜찮습니다 (아직 캐릭터를 회전시키지 않았습니다). 두 번째 반복에서 loc_look.x 값이 modelPos.x 값보다 큽니다 (TARGET 함수에서 내적 계산으로 지정된 각도를 사용하여 문자를 너무 많이 회전 시켰습니다). 따라서 두 번째 반복에서 내 코드는 벡터의 x 값의 차이를 조정하기 위해 문자를 왼쪽으로 회전합니다 ...

문자의 모양 벡터를 너무 크게 회전하지 않도록 어떻게 측정을 강화할 수 있습니까? 가치?

+0

(0,0,1)과 (0,0,15)가 평행하지 않습니까? –

+0

예 ... 좋은 지적이지만 개체가 각 반복마다 오른쪽으로 이동합니다. look.x의 값은 두 번째 반복에서 modelPos.x의 값을 초과 한 다음 그에 따라 조정됩니다 (왼쪽으로 회전). 결과는 흔들리는 영향입니다 (문자가 바르게 반복 된 후 왼쪽으로 반복됩니다). –

+0

"yawing"(Yaw (D3DXToRadian (yaw)) 전에 각도를 라디안으로 변환하려고 시도했는데, 이는 jittering을 방지하지만 각도가 상당히 감소 되었기 때문에 ... lookPad는 결코 modePos 벡터와 같지 않습니다 ... –

답변

4

내적은 단위 벡터 인 경우에만 두 벡터 간의 각도 코사인입니다. 이를 참조하십시오

//D3DXVec3Normalize(&loc_look, &loc_look); 

하지만이 두 벡터를 정상화해야합니까 :

http://en.wikipedia.org/wiki/Dot_product#Geometric_interpretation

을 나는 당신이 어떤 주석 라인을 참조하십시오.

생각해보십시오. 벡터가 모두 일정한 계수에 의해 축척되면 내적은 더 커집니다. 맞습니까? 따라서 arccos으로가는 값이 더 큽니다. 그러나 각도는 동일하므로 분명히 잘못되었습니다.

+0

정규화 된 후 벡터의 각 값의 합이 1이되어야합니까? 내 것은 ... –

+0

또한, 귀하의 예와 관련하여 ** oc_look = D3DXVECTOR3 (0, 0, 1), modelPos = D3DXVECTOR3 (0, 0, 15) ** 문자가 Z 축을 똑바로 향하고 있다고 말하고 있습니까? 그리고 모델도 똑바로 오버 헤드입니까? 이 경우 각도는 0입니다. 만약 당신이 단지 yaw에만 관심이 있다면, 더 좋은 예가 <1, -1, 0>을보고, 객체가 <3, 4, 0>이라고 보는 것 같습니다. "상향 축"이 Z 축입니까? – Kaz

+0

아니요! 단위 벡터의 ** 길이 **는 1입니다. 구성 요소의 합계가 아닙니다. x = x + y * y + z * z = 1이므로 sqrt (x * x + y * y + z)라는 단위 벡터의 내적을 취하면 그 값은 1이됩니다. * z) = 1). – Kaz

0

근사치는 부동 소수점 연산의 경우 정상입니다. 당신은 "엡실론 (epsilon)"값을 고려해야합니다. 그래서 내적 (dot product)이 가깝게 해결 된 후에 캐릭터가 트 위치를 잡지 않습니다.

관련 문제