Camera View
Chap 3 시작
기본적으로는 HongLav의
강의를 듣기에 일부 내용만 블로깅 할때 첨부하며
개인의 공부를 위해서 블로깅을 남기려 한다
-
Chap 3 를 수강한 이후부터는
Unreal 쪽의 그래픽 엔진 부분을 보며
이해해 나가는 과정을 지니면 좋을 것이라 하였다 -
또한, 개인적인 엔진을 제작해 보는것이
그래픽스 공부에 큰 도움이 된다고도 하였다
일단 Chap3 를 수강한 이후로는
언리얼 쪽의 엔진 코드를 보며 추가적인 공부를 해볼 예정이다
Camera View 에 대하여
이전까지는 거의 ‘고정’된 시점을 가지는 View 행렬을 사용했으나
일반적인 게임 등에서 ‘카메라’는 자연스럽게 움직일 수 있으므로
이러한 View 행렬에 대한 ‘변화’가 필요하다
그렇기에 Camera 클래스가 별도로 필요하게 되며
동시에, ‘Camera’라는 ‘관찰자’가
View 및 Projection 행렬을 반환하는 역할도 맞게 된다
예제 - View 행렬과 Mouse Update 구현하기
Matrix Camera::GetViewRow() {
// 렌더링에 사용할 View 행렬을 만들어주는 부분
// 이번 예제에서는 upDir이 Y로 고정되었다고 가정합니다.
// 시점 변환은 가상 세계가 통째로 반대로 움직이는 것과 동일
// m_pitch가 고개를 숙이는 회전이라서 -가 두번 붙어서 생략
// TODO:
return Matrix::CreateTranslation(-m_position) *
Matrix::CreateRotationY(-m_yaw) * Matrix::CreateRotationX(m_pitch);
}
Vector3 Camera::GetEyePos() { return m_position; }
void Camera::UpdateMouse(float mouseNdcX, float mouseNdcY) {
// 얼마나 회전할지 계산
// https://en.wikipedia.org/wiki/Aircraft_principal_axes
m_yaw = mouseNdcX * DirectX::XM_2PI; // 좌우 360도
m_pitch = mouseNdcY * DirectX::XM_PIDIV2; // 위 아래 90도
// 이동할 때 기준이 되는 정면/오른쪽 방향 계산
//TODO:
m_viewDir = Vector3::Transform(Vector3(0.0f, 0.0f, 1.0f),
Matrix::CreateRotationY(m_yaw));
m_rightDir = m_upDir.Cross(m_viewDir);
}
이번 예제 자체는 Vector3와 Matrix를 잘 사용하면 충분히 풀 수 있는 부분이었다
-
CreateTranslation
을 통해 ‘이동’ 행렬을,
CreateRotation
을 통해 ‘회전’ 행렬을 구할 수 있다
(이러한 행렬의 ‘적용’은곱
하여 적용한다는 점을 잊지 말자) -
Vector3::Transform
을 통하여
회전 등의변환
을 ‘적용’할 수 있음 -
ViewDir
은 ‘정면’을 담당하는 방향이므로
‘Vector3(0.0,0.0,1.0)’ 이 시작
이후, 좌우 360도 만이 적용되도록 한다 -
m_rightDir
은 ‘정면’을 담당하는 ViewDir을
m_upDir에 외적(Cross) 시켜 구할 수 있다
(이때, m_viewDir.Cross 를 통해 구하면 leftDir이 되므로 주의
외적은 순서를 바꾸면 값이 정 반대가 나옴) -
Yaw Pitch Roll
- 각각 y,x,z 를 기준으로 ‘회전’하는 역할을 가지는 축
(오일러 각도를 기반으로 하기에 나중에는 쿼터니언을 사용하는 편)
(항공 표준 이라는 말로도 사용된다)
각 축의 기준에 대하여
용어 | 기준 축 (DirectX / 항공 표준) | 설명 |
---|---|---|
Yaw | Y축 (수직 축, Up) | 좌·우로 도는 회전 (고개를 좌우로 돌리는 느낌) |
Pitch | X축 (우측 축, Right) | 상·하로 드는 회전 (고개를 위/아래로 끄덕이는 느낌) |
Roll | Z축 (앞뒤 축, Forward) | 몸을 비트는 회전 (고개를 기울이는 느낌) |
댓글남기기