'전체 글'에 해당되는 글 46건

  1. 2024.07.26 카메라
  2. 2024.07.26 렌더링 파이프 라인
  3. 2024.07.26 평면방정식

카메라

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
:

 

*렌더링 파이프 라인

- 3D좌표를 2D로 표현하기위해

로컬정점->월드 공간->뷰 공간->투영 공간 -> 뷰 포트 -> 최종 좌표로 변환하는 방식

- Position = LocalPosition * WorldMatrix * ViewMatrix * ProjectionMatrix

- TransMatrix = WorldMatrix * ViewMatrix * ProjectionMatrix

Position = LocalPosition * TransMatrix

 

*로컬 정점( local vertex )

- 초기의 모델링시에 정의된 좌표

- 각자의 좌표계에의해 정점이 배치된다.

 

*월드 스페이스( world space )

- 공간상의 기준 좌표계( direct3d : 왼손좌표계, openGL : 오른손좌표계 )

- 스케일, 회전, 이동이 적용된다.

- 월드 스페이스로 변환( WorldPosition = LocalPosition * WorldMatrix )

- IDIRECT3DDEVICE9::SetTransform( D3DTS_WORLD, &WorldMatrix )

 

*뷰 스페이스( view space )

- 공간에 카메라를 두어 카메라의 위치에서 바라볼때 카메라의 위치를 좌표계로 사용한다.

- 뷰 스페이스로 변환( ViewPosition = WorldPostion * ViewMatrix )

- IDIRECT3DDEVICE9::SetTransform( D3DTS_VIEW, &ViewMatrix )

 

*투영 공간( projection space )

- 원근 투영

ㄴ 2D화면에 물체를 그릴때 입체감과 거리감을 표한하기위해

멀리 있는 물체는 작게, 가까이 있는 물체는 크게 그려준고

시야각에 때라 같은 위치에서 볼수있는 범위와 물체의 크기가 달라진다.

ㄴ D3DXMatrixPerspectiveFovLH()

- 직교 투영

ㄴ 위에서 아래에 있는 평면을 바라보는 방식이고 원근감이 없다.

ㄴ D3DXMatrixOrthoLH()

- 뷰 스페이스로 변환( ProjPosition = ViewPostion * ProjMatrix )

- DIRECT3DDEVICE9::SetTransform( D3DTS_PROJECTION, &ProjectionMatrix)

 

 

 

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

*좌표계*삼각비*내적-정사영  (0) 2024.07.26
카메라  (0) 2024.07.26
평면방정식  (0) 2024.07.26
외적  (0) 2024.07.26
내적  (0) 2024.07.26
Posted by mainep
:

평면방정식

programming/etc 2024. 7. 26. 10:21 |

 

*평면방정식

-평면의 법선벡터와 원점간의 거리d를 알고있을때 점P가 평면에 대해 어느 위치에 있는지 판별 할 수 있다.

-법선벡터 N(a,b,c), 점P(x,y,z), 거리d

- ax + by + cz + d = 0

 

- 점P의 위치 판별

ax + by + cz + d = 0 일때 점P는 평면 위에 존재한다.

ax + by + cz + d > 0 일때 점P는 평면 앞에 존재한다.

ax + by + cz + d < 0 일때 점P는 평면 뒤에 존재한다.

( 법선벡터가 향하는 방향을 앞이라 둔다. )

 

-

사각형을 이루는 A,B,C,D 네 점이 있다.

 

A----B

l l

l l

C----D

 

이때

벡터 v1 = B - A

벡터 v2 = C - A

 

이 두 벡터를 외적연산하여 법선벡터 N을 구할 수 있다.

N.x = v1.y * v2.z - v1.z * v2.y

N.y = v1.z * v2.x - v1.x * v2.z

N.z = v1.x * v2.y - v1.y * v2.x

 

여기서 구한 N에 벡터를 구했던 A, B, C 세 점중 아무 한 점을 내적하면 d값을 구할 수 있다.

( 내적 값이 -d가 되므로 내적 * -1 = d )

 

* D3DXPlaneFromPoints()

- 세점을 인자로 평면 D3DXPLANE을 반환한다.

 

* D3DXPlaneDotCoord()

- D3DXPLANE과 D3DXVECTOR3를 인자로 받아 평면방정식을 연산한다.

- ax + by + cz + d의 값을 반환한다.

 

 

 

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

카메라  (0) 2024.07.26
렌더링 파이프 라인  (0) 2024.07.26
외적  (0) 2024.07.26
내적  (0) 2024.07.26
사업자등록 통신판매업  (0) 2024.07.26
Posted by mainep
: