programming/etc

카메라

mainep 2024. 7. 26. 10:22

 

*카메라

양의 z축을 바라보는 벡터를 기준으로 회전 행렬을 만들어준다.

회전시킨곳은 카메라의 방향벡터가 되고

회전행렬의 (3,1), (3,2), (3,3) 원소는 각 xyz의 값으로 좌표를 얻어낼 수 있다.

얻어낸 좌표는 방향벡터이므로 방향벡터에 -1을 곱하여 반전시켜준다.

이는 카메라의 위치가 된다.

카메라의 위치를 회전행렬의 위치성분을 나타내는 (4,1), (4,2), (4,3)에 넣어주고

카메라의 타겟이 될 대상의 이동행렬과 곱해준다 ( rotateMatrix * translationMatrix )

새로 얻어낸 행렬은 뷰 행렬의 역행렬이 되고 이행렬의 역행렬을 다시 구해주면 view행렬이 완성된다.

 

*회전행렬의 (3,1), (3,2), (3,3)

x축을 기준으로 @만큼 회전시킨 행렬의 3행성분과 y축을 기준으로 #만큼 회전시킨 행렬과의 연산된 값으로

x = (3,1) = sin@ * cos#

y = (3,2) = -cos@

z = (3,3) = sin@ * sin#

값을 가진다.

이 x,y,z성분은 양의 z축을 바라보는 벡터를 회전시킨 방향벡터가 된다.

 

즉

양의 z축( 0.f, 0.f, 1.f )을 바라보는 zup벡터를 1x4행렬로 변환하여 w원소에 0을 넣고

회전행렬 matRo와 행렬x행렬 연산하여 3차원 벡터로 다시 변형 시켜준것과 같다.

 

*X축기준 회전행렬 matRoX

1 0 0 0

 

0 sin@ cos@ 0

 

0 -cos@ sin@ 0

 

0 0 0 1

 

*Y축기준 회전행렬 matRoY

sin@ 0 -cos@ 0

 

0 1 0 0

 

cos@ 0 sin@ 0

 

0 0 0 1

 

*matRoX(@) * matRoY(#) = matRoXY( 최종 회전 행렬 )

sin# 0 -cos# 0

 

 

cos@ sin@ cos@ 0

*cos# *sin#

 

 

sin@ -cos@ sin@ 0

*cos# *sin#

 

 

0 0 0 1

 

(3,1) = sin@ * cos#

(3,2) = -cos@

(3,3) = sin@ * sin#

 

*zup( 0, 0, 1, 0 ) * matRoXY

 

(1,1) = ( 0 * sin# ) + ( 0 * cos@ * cos# ) + ( 1 * sin@ * cos# ) + ( 0 * 0 ) = sin@ * cos#

(1,2) = ( 0 * 0 ) + ( 0 * sin@ ) + ( 1 * -cos@ ) + ( 0 * 0 ) = -cos@

(1,3) = ( 0 * -cos# ) + ( 0 * cos@ * sin# ) + ( 1 * sin@ * sin# ) + ( 0 * 0 )

(1,4) = ( 0 * 0 ) + ( 0 * 0 ) + ( 1 * 0 ) + ( 0 * 1 )

 

*

x = matRoXY(3,1) = ( zup * matRoXY )(1,1)

y = matRoXY(3,2) = ( zup * matRoXY )(1,2)

z = matRoXY(3,3) = ( zup * matRoXY )(1,3)

 

 

D3DXMATRIX matRo, matTrans;

D3DXMATRIX matRoX, matRoY;

D3DXMatrixRotationYawPitchRoll( &matRo, D3DXToRadian( m_fYaw ), D3DXToRadian( m_fPitch ), 0.f );

 

//D3DXMatrixRotationX( &matRoX, D3DXToRadian( m_fPitch ) );

//D3DXMatrixRotationY( &matRoY, D3DXToRadian( m_fYaw ) );

//matRo = matRoX * matRoY;

 

D3DXVECTOR3 vTrans( matRo._31, matRo._32, matRo._33 );

 

vTrans *= -1.f;

 

D3DXVec3Normalize( &vTrans, &vTrans );

 

vTrans *= ( 10.F + GETINST(CMouseMgr)->GetWheel() );

 

matRo._41 = vTrans.x;

matRo._42 = vTrans.y + 1.f;

matRo._43 = vTrans.z;

 

D3DXMatrixTranslation( &matTrans, m_vCurPos.x, m_vCurPos.y, m_vCurPos.z );

 

m_matView = matRo * matTrans;

 

D3DXMatrixInverse( &m_matView, NULL, &m_matView );

 

D3DDEVICE()->SetTransform( D3DTS_VIEW, &m_matView );

 

return &m_matView;