수학/이득우의 게임 수학

외적의 활용 (4) - 회전행렬의 생성

monstro 2026. 4. 29. 11:33
728x90
반응형

- 개요

임의의 두 벡터에 직교하는 벡터를 생성하는 외적의 성질은 카메라의 회전을 설정하는데도 사용한다

 

- 회전행렬을 생성하는 벡터의 외적

물체를 바라보는 카메라의 설정

 

이전까지 배운 오일러 각 방식을 사용하여 카메라의 회전을 지정할 수 있었지만,

외적을 사용하면 카메라의 시선 벡터 정보로부터 카메라의 세 가지 로컬 축을 구하고

구한 값을 이용하여 회전행렬까지 얻어낼 수 있다

 

1) 회전행렬 생성 과정 - 카메라의 트랜스폼의 세 가지 로컬 축 구하기

카메라의 트랜스폼을 구성하는 세 가지 로컬 축은 다음과 같은 과정을 거쳐 구할 수 있다

  • 로컬 Z축의 생성 : (물체의 위치 - 카메라의 위치)의 벡터를 정규화 + 결과값은 v 벡터라고 표현
  • 로컬 X축의 생성 : 업벡터 u(월드 공간의 y축) × 카메라의 시선 벡터 v를 연산 + 결과값을 정규화
  • 로컬 Y축의 생성 : 로컬 Z축의 벡터 × 로컬 X축의 벡터

 

최종적으로 다음과 같이 정리할 수 있다

카메라의 시선 벡터 v와 업벡터 u를 사용한 카메라의 로컬 공간의 세 기저벡터

 

2) 회전행렬 생성 과정 -  회전행렬 생성

카메라 트랜스폼의 회전행렬 R

 

카메라 트랜스폼의 회전행렬 R은 로컬 벡터를 열벡터로 지정하여 위와 같이 생성할 수 있다

그러나 시선 벡터로 카메라의 로컬 축을 계산하는 방식은 고려해야 하는 예외 상황이 존재한다

 

2 - 1) 예외 상황 - 카메라가 거꾸로 뒤집힌 상황

일반적인 상황에서는 카메라가 위를 향하도록 세워져 있겠지만,

카메라가 거꾸로 뒤집힌 상황이라면 업벡터로 월드 공간 y축의 반대 방향인 (0, -1, 0)을 사용해야 한다

따라서 외적에 사용할 업벡터의 값을 입력받도록 설계하는 것이 안전하다

 

 

프로젝트에서 카메라의 역할을 수행하는 CameraObject 클래스를 위와 같이 구성하였다

시선 벡터를 인자로 입력받아 카메라의 방향을 재조정하는 SetLookAtRotation 함수를 선언하였다

해당 함수에서 카메라가 똑바로 세워져 있는지 확인하는 InUp 인자를 받도록 설계하였고,

기본 값으로 월드 공간의 Y축을 사용하도록 정의하였다

 

2 - 2) 예외 상황 - 카메라의 로컬 Z축이 업벡터와 평행한 상황

다음으로 고려해야 하는 상황은 카메라의 로컬 Z축업벡터평행한 상황이다

두개의 벡터가 평행하면 외적의 결과가 영벡터가 되어 더 이상 계산을 진행할 수 없다

이런 경우에는 외적을 계산하는 대신 로컬 Z축직교하는 로컬 X축의 값을 수동으로 지정해야 한다

 

 

2 - 1)에서 선언한 SetLookAtRotation 함수의 로직은 위와 같다

카메라의 세개의 로컬 축을 가져와 카메라의 트랜스폼에 반영하는데,

이때 카메라의 로컬 Z축업벡터평행한지 비교한다

평행하다월드 X축의 값로컬 X축의 값으로 사용하고, 평행하지 않으면 식을 계산하여 사용한다

728x90
반응형