2010. 7. 5. 02:24

오리엔테이션 생성중 실수.

랜덤함수를 활용할때 한번더 생각해보고 하자.
전에 데미지를 추출할때도 0으로 나누는 에러가 났었다. 그때도 랜덤함수때문에..

pGoblin->GetSceneObject()->LookAt( D3DXVECTOR3( 0, 0, 0 ), D3DXVECTOR3( rand()%10-5, 0, rand()%10-5 ), D3DXVECTOR3( saengine::COrientation::Y_AXIS ) );

첫번째 파라메터는 위치, 두번째 파라메터는 바라보는 위치, 세번째 파라메터는 업벡터를 뜻하는데
두번째 파라메터를 보면 저 처리대로라면 0, 0, 0이 나올 수 있다.
그러니까.. 위치와 바라보는 위치가 똑같아 지고, 결과적으로 업벡터와 측면벡터가 0,0,0이 나오는 사태가 벌어지게 된다. 그래서 간단하게 아래와 같이 바꾸었다.

INT targetX = rand()%10-5;
 INT targetZ = rand()%10-5;

 if( targetX + targetZ == 0 ) targetX = 1;
 
 pGoblin->GetSceneObject()->LookAt( D3DXVECTOR3( 0, 0, 0 ),
  D3DXVECTOR3( targetX, 0, targetZ ), D3DXVECTOR3( saengine::COrientation::Y_AXIS ) );

허나 무엇보다 중요한건 엔진자체에 assert처리를 해야하는 점이었다..
비록 프로그래밍은 잘못하더라도 에러는 나야 정상아닌가 싶어 수정하기로 했다.
그래서 아래와 같이 수정해주었다.

VOID COrientation::SetDirection( const D3DXVECTOR3& viewDir, const D3DXVECTOR3& upDir, const D3DXVECTOR3& rightDir )
{
 // 오브젝트의 월드내 방향이다.
 m_vecViewDir = viewDir;
 m_vecUpDir  = upDir;
 m_vecRightDir = rightDir;
 NormalizeDirections();
 debug_assert(
  !( m_vecViewDir.x == 0.0f && m_vecViewDir.y == 0.0f && m_vecViewDir.z == 0.0f ) &&
  !( m_vecUpDir.x == 0.0f && m_vecUpDir.y == 0.0f && m_vecUpDir.z == 0.0f ) &&
  !( m_vecRightDir.x == 0.0f && m_vecRightDir.y == 0.0f && m_vecRightDir.z == 0.0f ),
  _T("제로벡터 에러") );

.....


 

'작업일지' 카테고리의 다른 글

모델이 깨지는경우  (0) 2010.07.16
캐릭터 충돌처리  (1) 2010.07.07
그림자 처리..  (0) 2010.06.26
Perspective Shadow Map..  (0) 2010.06.22