• Home
  • About
    • 게임 개발자 유정룡 photo

      게임 개발자 유정룡

      포트폴리오

    • Learn More
    • Email
    • Github
    • Bitbucket
  • Projects
    • All Projects
    • All Tags

Direct3D11 공부 16일차(Camera)

17 Jun 2021

Reading time ~1 minute

Camera

무엇을 바라볼때 카메라가 있어야 한다. 그렇다… (계산식을 보면 없으면 좋을 것 같ㄷ….)

일단 카메라에 필요한 것들은 회전 그리고 위치이다. (크기는 필요 없다)

일단 함수 소개 먼저 해야겠다.

D3DXMATRIX *D3DXMatrixLookAtLH
(     
    D3DXMATRIX *pOut,
    CONST D3DXVECTOR3 *pEye,
    CONST D3DXVECTOR3 *pAt,
    CONST D3DXVECTOR3 *pUp
);

왼손 좌표계(DX에서 많이 사용하는)에서 사용하는 바라보는 행렬 함수이다.

중요한건 이 함수 사용법이 아니고 안에 있는 내부가 어떻게 작동되는지 이다.

일단 안에 행렬 계산을 먼저 보자

zaxis = normal(At - Eye)
xaxis = normal(cross(Up, zaxis))
yaxis = cross(zaxis, xaxis)

 xaxis.x           yaxis.x           zaxis.x          0
 xaxis.y           yaxis.y           zaxis.y          0
 xaxis.z           yaxis.z           zaxis.z          0
-dot(xaxis, eye)  -dot(yaxis, eye)  -dot(zaxis, eye)  1

하나하나 차근차근 생각해보자

  • Zaxis
    • 벡터의 차는 뒤의 벡터가 앞의 벡터를 바라보는 방향이다.
    • 따라서 카메라에서 보고 있는 방향으로 정규화 한 벡터이다.
  • Xaxis
    • Up벡터(0,1,0) 과 zaxis의 외적을 정규화 한 벡터이다.
    • 보는 방향인 벡터와 위로 가는 벡터의 외적의 정규화한 벡터이다.
  • Yaxis
    • 지금까지 구한 Z,Xaxis의 외적이다.

이 부분은 조금만 생각하면 알 수 있다.

현재의 Rotation은 구했다. 이제 위치를 구해야 한다.

(1,0,0)의 값을 가진 forward 방향 벡터가 있을때 카메라의 위치가 (5,1,1)이란느 벡터값을 갖고있고 이 둘값을 내적 하면 5라는 값이 나온다. 이 값은 x방향으로 5만큼 이동한 것이다.

그런데 왜 음수이냐 그것은 카메라가 이동할때 카메라 입장에서 물체들은 반대로 움직이기 때문이다.

그러면 이동할때는 별로 문제 없이 현재 위치에 xyz축 값만 더해주면 된다.

하지만 문제는 회전이다. 이 회전에는 삼각 항등식이 필요하다.

이런 방식으로 회전을 하면 된다… 아직 이해 할만한 레벨이 아닌거 같다….. ㅠㅠ 일단 외우자



DirectX Share Tweet +1