갬장장이
[Mathematics] 18. Quaternion
갬장장이
갬장장이의 코드 대장간
갬장장이
전체
오늘
어제
  • 분류 전체보기
    • 게임 연구소
    • 게임 제작
      • Banditors (2024~)
      • Rovenhell (2023)
      • Geophyte (2020~2021)
      • 아드레날린 러시 (2021)
      • Treadmill (2019)
      • 습작들 (2019~)
      • 그 외 (~2018)
    • 개발
      • 언리얼 엔진
      • 수학
      • 네트워크
      • 그래픽스
      • OpenGL
      • DirectX
    • 일상
    • 기타 제작

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

  • [공지] 블로그 안내

인기 글

최근 댓글

최근 글

hELLO · Designed By 정상우.
개발/수학

[Mathematics] 18. Quaternion

2022. 4. 24. 18:43

지난 포스트에선 한 축에 대해 세타만큼 회전시키는 방법을 알아보았는데, 이러한 방식은 하나의 축에 대해서만 회전을 나타낼 수 있다는 문제점이 있다. 동시에 두 축 이상에 대한 회전을 하나의 값으로 나타내고 싶은 경우 우리가 사용할 수 있는 방법이 Quaternion(사원수)의 사용이다.

 

사원수를 정의내리려면 생각보다 많은 수학적인 설명이 필요한데, 이에 관해선 해당 글을 읽어보는 것을 권장한다.

간략하게 설명하면 사원수는 실수부와 허수부로 나타내어지며,

실수부는 스칼라값 하나 (w), 허수부는 어떤 크기 3인 실수값을 원소로 가지는 벡터에 허수 i,j,k를 벡터의 각 원소에 곱해준 형태이다. (v)

이를 편의를 위해 프로그래밍 시에는 그냥 [w, v] = [w, vx, vy, vz]의 vector4 형태로 나타내고 있지만, 어쨌든 사원수의 본질은 단순히 실수 4개를 원소로 갖는 벡터가 아니라는 것이 중요하다.

 

1.

지난 시간에 다룬 Axis-rotation은 축이 되는 벡터 n과 각 세타가 주어지면 회전을 표현할 수 있었다.

우리는 어떤 Axis-rotation을 Quaternion의 형태로 표현할 수 있으며, 그 식은 다음과 같다.

 

예시를 들어보자면, 벡터 (1,0,0)을 축으로 하여 (=x축) 90도 회전시키는 행위를 사원수로는 (루트2 / 2, 루트2 / 2, 0, 0)으로 표현 가능하다.

 

2.

Unit Quaternion이란 Unit Vector와도 유사한 개념으로,

크기가 1인 사원수를 의미한다.

어떤 사원수의 크기는 (w, x, y, z) 꼴일때 sqrt( w^2 + x^2 + y^2 + z^2 )이다.

* 즉 벡터 v를 포함하는 (w, v) 꼴일때 sqrt(w^2 + v^2)라는 일반적인 식으로 나타낼 수 있다.

 

3.

Identity Quaternion이란, Identity Matrix와도 유사한 개념으로,
(1, 0) 꼴의 사원수를 의미한다. 여기서 0은 0벡터를 의미하며, x,y,z축이 있을 경우 이는 (1, 0, 0, 0) 꼴이라는 것에 주의하자.

*왜 (1, 0)이 Identity Quaternion인지는 사원수를 구하는 공식을 생각하면 쉽다. 어떠한 회전도 하지 않은 상태라면 세타 = 0이기 때문에 (1, 0벡터) 꼴이 나올 수 밖에 없다.

 

4.

Quaternion Inverse는 행렬에서의 역행렬과 유사한 개념으로, quaternion q = (w, v)가 주어졌을때 q * q^-1 = (1,0) = Identity Quaternion을 만드는 quaternion이다. 

 

역사원수를 구하는 것은 굉장히 쉬운데, 어떤 사원수 q에 대한 역사원수 q^-1은 곱했을 때 q가 apply한 회전을 다시 원상태로 되돌리는 사원수라고 생각하면 편하다. 즉 q가 벡터 n을 축으로 세타만큼 회전시켰다면, q^-1은 벡터 n을 축으로 -세타만큼 회전시키면 되는 것이다.

 

세타에 -세타를 집어넣으면, 결국 cos(세타/2), 즉 w값은 변하지 않고

뒷부분 v값은 전부 부호가 거꾸로 되는 것을 알 수 있다.

고로 이를 일반화하여 나타내면 다음과 같다.

 

q (w, v)의 역사원수 q^-1 = (w, -v)

(w, x, y, z).inverse() = (w, -x, -y, -z)

* 정확한 명칭인지 확실하지 않지만, 편의를 위해 역사원수라고 적었다.

저작자표시 비영리 변경금지 (새창열림)

'개발 > 수학' 카테고리의 다른 글

[Mathematics] 20. Quaternion을 이용한 정점 회전  (0) 2022.05.18
[Mathematics] 19. Quaternion Multiplication  (0) 2022.04.24
[Mathematics] 17. Axis-Angle Rotation (Rodrigues formula)  (0) 2022.04.08
[Mathematics] 16. Plane Intersection & Frustum Culling  (0) 2022.04.03
[Mathematics] 15. 3차원 Line-AABB Intersection  (0) 2022.04.03
'개발/수학' 카테고리의 다른 글
  • [Mathematics] 20. Quaternion을 이용한 정점 회전
  • [Mathematics] 19. Quaternion Multiplication
  • [Mathematics] 17. Axis-Angle Rotation (Rodrigues formula)
  • [Mathematics] 16. Plane Intersection & Frustum Culling
갬장장이
갬장장이
갬장장이의 코드 대장간갬장장이 님의 블로그입니다.
상단으로

티스토리툴바

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.