기본 콘텐츠로 건너뛰기

라벨이 Cross Product인 게시물 표시

Shipping Box - #2

이전 글 에서 미처 고려하지 못했던 사항이 있어 이 글을 작성하게 되었습니다. 길이가 가장 긴 직선 구간을 선택해 그와 붙어 있는 직선 구간을 선택해 두 벡터를 외적하여 폭 벡터를 구한다 위 부분은 두 직선 구간이 수직이라는 가정으로 작성되었습니다. 어제 동료와 이야기하다 45도로 연결된 구간을 어떻게 처리해야 하는지 고민이 된다는 이야기를 들었을 때 이전 글에서 위 부분이 문제가 있다는 것을 알았습니다. 수학 시간에 우리가 배웠던 모든 축 벡터를 서로 수직입니다. 한번 기억을 더듬어 보시기 바랍니다. 따라서 우리가 구해야 하는 축 벡터도 서로 수직이어야 합니다. 또 다른 말로 서로 독립적이어야 합니다. 그런데 두 직선 구간이 45로 연결되어 있다면 두 구간을 독립적이지 않게 됩니다.(한 축의 좌표가 다른 축 좌표 값을 포함하게 됩니다.) A, B 벡터가 있다고 가정하고 두 벡터가 서로 수직이지 않다고 하면, A, B 벡터 외적으로 A, B에 수직인 C를 구할 수 있습니다. $$\vec{C} = \vec{A}\times\vec{B}$$ 그리고 A, C 벡터 외적을 통하여 B 벡터를 구할 수 있습니다. 이때 B 벡터는 A, C 벡터에 수직이 됩니다. 이로써 세 벡터 A, B, C는 수직이며 서로 독립적입니다. $$\vec{B}=\vec{A}\times\vec{C}$$ 이로써 이전 글의 문제점을 보완할 수 있습니다. 하지만 복잡해 보입니다. 단순함이 복잡함보다 아름답습니다. 이전 글에서의 목적을 간단히 되짚어 보면 점들을 포함하는 OrientedBoundingBox를 구하는 것입니다. 위 점들에서 가장 멀리 떨어진 두 점을 선택하고 두 점을 잇는 선(A)을 구합니다. 이 선에서 가장 멀리 떨어진 점을 하나 선택해 선에 수직인 다른 선(B)을 구합니다. A, B 두 선의 외적을 이용하여 두 선에 수직인 벡터 C를 구할 수 있습니다. 점들을 A, B, C 축으로 변환하여 점들을 포...

[3D] 벡터 오른손 법칙(Right-Hand Rule)

 두 벡터($\vec{A}, \vec{B}$)의 외적은 외적의 크기와 방향을 가지는 또 하나의 벡터로 표현할 수 있습니다. 기하학적으로 보면 두 벡터가 이루는 평면에 수직인 벡터(법선 벡터)가 됩니다. 평면에 수직인 벡터는 평면의 위쪽 혹은 아래쪽으로 2개의 방향성을 가집니다. 우리가 배워온 수학이나 OpenGL에서는 오른손 법칙을 통하여 법선 벡터의 방향성을 결정합니다. 오른손을 악수하듯이 펴서 첫번째 벡터 방향으로 놓습니다. 그리고 손가락을 두번째 벡터가 놓인 방향으로 굽힙니다.(손등 방향으로 꺽이는 분은 없겠죠?) 이때 엄지 손가락의 방향이 법선 벡터의 방향입니다. 이렇게 몇번 하다보면 두 벡터가 놓인 위치에 따라 방향이 바뀌는 것을 확인할 수 있습니다. 참고로 Unity나 Direct3D는 왼손 법칙을 이용하여 외적의 방향을 결정한다고 합니다.