카메라

programming/etc 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;

 

'programming > etc' 카테고리의 다른 글

OBB 충돌  (0) 2024.07.26
*좌표계*삼각비*내적-정사영  (0) 2024.07.26
렌더링 파이프 라인  (0) 2024.07.26
평면방정식  (0) 2024.07.26
외적  (0) 2024.07.26
Posted by mainep
: