[게임 수학] 삼중곱

ounols·2021년 11월 12일
2

게임 수학

목록 보기
4/9
post-thumbnail

🧐 해당 파트는 게임 개발 환경을 구성하는 컴퓨터 그래픽스(Computer Graphics)를 이해하기 위한 기초 수학의 간단한 개념에 대해 설명하고 있습니다!

혹여나 이해가 잘 안되거나 잘못된 정보를 발견하시게 되었다면 관련해서 피드백 해주시면 정말 감사하겠습니다!

내적과 외적을 조합하여 3개의 벡터를 연산하는 것이 바로 삼중곱입니다.

내적과 외적의 결과값이 서로 달라 계산이 불가능한 식도 존재합니다.
이렇게 뭔가 까다로운 것 같은 삼중곱이 어디에 쓸모가 있을까요?

1. 스칼라 삼중곱 결과값의 의미

어? 잠깐! 다시 생각해보니 뭔가 저번에 내적과 외적을 응용했던 기억이 있습니다.

사실 삼중곱의 결과값으로 노멀 벡터가 직교벡터임을 증명했었습니다!

이 때 배운 내용이 두 벡터를 외적하여 직교하는 벡터를 구하고
직교하는 벡터와 두 벡터 중 하나를 내적하면 직교하는 성질로 인해 무조건 0이 된다는 내용이였습니다.
이 이외에도 삼중곱을 이용해 좌우 판별을 하는 공식을 실습을 통해 직접 확인해보기도 했습니다!

이 정도 했으면 얼추 느낌이 오시나요?
스칼라 삼중곱의 의미는 비록 결과값이 벡터는 아니지만
직교나 평행에 관련하여 판별할 수 있는 데이터를 여러 방면으로 응용하여 얻어올 수 있습니다!

이번 글은 행렬식과 이런 삼중곱으로 알 수 있는 정보를 알아보도록 하겠습니다.

1-1. 스칼라 삼중곱과 행렬식과의 관계..?

수학에서 행렬을 쓰는 이유는 바로 방정식의 해를 찾기 위해서 입니다.
저희는 지금까지도 정말 많은 방정식을 해결하기 위해 행렬을 응용해왔습니다!

혹시 예전 중, 고등학교 시절에 배웠던 연립 방정식 관련 문제를 풀면서 '해가 없다'가 정답이였던 문제를 기억하시나요?

이처럼 '해가 없는 방정식'의 뜻을 행렬에서는 '역행렬이 존재하지 않는다'가 됩니다!
역행렬이 없다는 걸 판별할 수 있는 식을 바로 행렬식(determinant)이라고 합니다.

2차원에서는 두 기저벡터가 같은 방향을 가지지 않는다면 두 벡터 사이의 면적이 생기면서 내가 원하는 2차원 좌표의 해를 구할 수 있습니다.
그러나 서로 평행인 상태일 때 두 벡터 사이의 차원이 존재하지 않아 2차원 좌표를 구할 수 없습니다.

이를 연립 방정식으로 풀어서 최종적으로 얻을 수 있는 식은 바로 det(A)=adbcdet(A) = ad - bc 입니다.

이번엔 3차원에서 생각해보도록 하겠습니다!
앞서 2차원 방정식에서 두 벡터 사이에 면이 생기지 않는다면 역행렬이 존재하지 않는다라고 했습니다. 그렇다면 3차원은 언제 역행렬이 없는 상태가 될까요?

위 이미지처럼 세 기저벡터들이 한 평면 또는 직선과 같이 선형 의존적인 상태가 존재할 때 공간을 표현할 수 없으므로 역행렬이 없는 상태, 즉 해가 없는 상태를 의미합니다!

세 벡터가 직교하지 않고 모두 선형 의존적으로 이루어져있다... 뭔가 외적과 내적을 잘만 사용하면 될 것 같다는 생각이 듭니다!

1-2. 삼중곱을 통해 행렬식을 만들어봅시다.

먼저 세 벡터 중 두 벡터를 외적하여 두 벡터가 존재하는 평면에서 직교하는 벡터를 구하고
마지막 남은 한 벡터가 외적하여 얻은 벡터와 또 직교하는지 확인해주면 됩니다.
직교하는지를 판별을 위해 내적을 통하여 0이 나오면 직교하는 것으로 확인이 가능합니다.

이전에 배웠던 노말벡터가 두 벡터에 대해 항상 직교하는 증명식과 정말 많이 비슷합니다!

어쨌든 이를 식으로 다시 표현하자면 아래와 같이 나옵니다.

(A×B)C=0(\vec A \times \vec B) \cdot \vec C = 0

여담으로 수학에서 따로 배우게되는 행렬식을 구하는 방법 중 하나인 사뤼스 도식이 존재합니다.

이렇게 외적과 내적을 통해 직접 계산하는 방식이 아닌 이전 2차원처럼 각각 X자로 곱해서 빼거나 더하는 방식입니다.

그런데 사실 사뤼스 도식은 특정 차원 내에서의 삼중곱과 같은 식으로 유도할 수 있다고 합니다!
서로 다른 형태로 계산을 시작하지만 결국 같은 식이라는 것이 신기하네요!

2. 벡터 삼중곱 공식을 직접 유도해봅시다.

이건 전개하면서 신기했던 기억이 납니다. 한번 알아봅시다!
먼저 일반적인 외적 공식은 아래와 같습니다.

v×w=(vywzwyvz, vzwxwzvx, vxwywxvy)\vec{v}\times\vec{w}=\left(v_yw_z-w_yv_z,\ v_zw_x-w_zv_x,\ v_xw_y-w_xv_y\right)

그리고 저희가 유도해볼 삼중곱은 (u×(v×w)(\vec{u}\times(\vec{v}\times\vec{w}) 입니다.
여기서 이제 좀 특이하게 접근을 해보도록 하겠습니다. x,y,zx, y, z 다 따로 한번 추출해봅시다!
먼저 xx값에 해당하는 부분인 yzzyyz-zy를 들고오도록 하겠습니다.

(u×(v×w))x=uy(v×w)z(v×w)yuz=uy(vxwywxvy)(vzwxwzvx)uz=vx(uywy+uzwz)wx(uyvy+uzvz)(\vec{u}\times(\vec{v}\times\vec{w}))_x = u_y \cdot (\vec{v}\times\vec{w})_z - (\vec{v}\times\vec{w})_y \cdot u_z \\ = u_y(v_xw_y-w_xv_y)-(v_zw_x-w_zv_x)u_z\\ =v_x(u_yw_y+u_zw_z)-w_x(u_yv_y+u_zv_z)

일단 여기서 vxuxwxwxuxvx=0\red{v_xu_xw_x-w_xu_xv_x=0}이라는 식을 추가해보도록 합시다.

=vx(uywy+uzwz)wx(uyvy+uzvz)+vxuxwxwxuxvx=vx(uxwx+uywy+uzwz)wx(uxvx+uyvy+uzvz)=v_x(u_yw_y+u_zw_z)-w_x(u_yv_y+u_zv_z) \red{ + v_xu_xw_x-w_xu_xv_x} \\ =v_x(\blue{u_xw_x+u_yw_y+u_zw_z})-w_x(\blue{u_xv_x+u_yv_y+u_zv_z})

...어? 어디서 많이 본 식입니다.

짜잔! 괄호 내부가 전부 내적 공식이 되었습니다!

=vx(uw)wx(uv)=v_x(\blue{\vec{u}\cdot\vec{w}})-w_x(\blue{\vec{u}\cdot\vec{v}})

어쨌든 이러한 원리는 나머지 y,zy,z에도 똑같이 적용되기 때문에 결국 아래와 같은 놀라운 공식이 성립됩니다.

u×(v×w)=(uw)v(uv)w\vec{u}\times\left(\vec{v}\times\vec{w}\right)=\left(\vec{u}\cdot\vec{w}\right)\vec{v}-\left(\vec{u}\cdot\vec{v}\right)\vec{w}

3. 삼중곱을 유도하면서 알게된 사실

분명 3차원적으로 계산을 했을텐데... 두 벡터에 스칼라를 곱해서 서로 빼는 공식, 2차원적인 공식이 유도되었습니다.
이 공식에서 알 수 있는 사실은 벡터 삼중곱이 결국 두 벡터가 존재하는 평면에 의존적인 벡터값만 나온다는 것을 의미할 수 있을 것 같습니다!

뭐.. 외적으로 직교하는 벡터를 얻은 뒤 그걸 또 외적해서 직교한다면.. 결국 두 벡터의 평면으로 가는게 당연한 결과이긴 하겠군요!

어쨌든 계산하고자 하는 차원에서 고차원적인 계산 방식 중 하나라는 점을 알게되었습니다.
앞으로도 이런 삼중곱의 성질을 이용하여 계산을 할 예정이니 따로 다루게 되었습니다!

profile
(게임 엔진 프로그래머가 되고싶은) 게임 클라이언트 프로그래머

0개의 댓글