카메라
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 |