본문 바로가기
Minecraft Forge/기타 메모

Vanilla Minecraft Vec3 에서 회전에 관해

by 정우 :P 2016. 5. 18.

진짜 그냥 자려고 했지만 소름돋아서 글을 쓰게된다...

 

바닐라 마인크래프트 Vec3 클래스에 해당 벡터를 주어진 각도 만큼 회전시켜주는 메소드가 있는데, (X, Y, Z 축을 중심으로)

이 메소드를 보고 처음에 의문이 들었다.

 

(소스를 올리면 안되므로 계산식만 적겠다.)

(회전하기 전의 좌표를 x, y, z 이라 하고 회전 후의 좌표를 x', y', z', 회전 각도를 Θ라 하면

 

 

(위와 같이 계산되게 되있다)

 

이 내용을 이해하려면 회전 변환에 대해 알고있어야 하는데, 회전 변환에 대한 자세한 증명은

다음번에 다룰 것이고 여기선 간단히 계산식만 쓰겠다.

 

기본적으로 +Z 축에 대하여 오일러 각에 대한 회전 (보통 흔히 쓰는 3가지 X, Y, Z 축에 대하여 일정한 각도를 각각 회전 시키는 것) 변환 행렬은 아래와 같다. (이떄 Θ는 회전각)

 

 

이를 이용해 각 성분의 값을 계산하게 되면,

 

 

이므로

 

최종적으로

 

가 된다.

 

그리고 위의 바닐라 소스와 대조를 해보면 이상하다는 걸 쉽게 알 수 있다.

바로 y' 과 z'을 구하는 식에서 원래 부호는 - 와 + 가 사이에 들어가야 하는데 바닐라 소스에선 + 와 - 가 되어있는 것을 알 수 있다.

 

순간 당황해서 나는 '내가 뭘 잘못 계산했나?' 했는데,

바닐라 소스에서 저 메소드를 이용하는 부분을 찾고나서 이유를 알게되었다.

 

EntityPlayer 클래스 내에 updateItemUse 메소드 중간 부분에서 보면 pitch 값에 - 가 붙어있는 것을 확인할 수 있다.

(참고로 pitch 라는 것은 여기서 x 축 방향으로 회전한 정도를 의미한다. 그리고 뒤의 Math.PI / 180.0F 는 60분법의 각을 호도법의 각 즉, 라디안으로 바꾸기 위해 하는 것이다.)

 

'이게 뭐?' 라고 생각하는 분들이 있을 것 같아서 상세하게 설명하자면,

기본적으로 각을 나타낼 때 반 시계 방향으로 회전했을 때의 각을 양수로, 시계 방향으로 회전했을 떄의 각을 음수로 나타낸다.

(3차원 공간 상에서 생각을 했을 때, 시계 방향(CW) 혹은 반 시계 방향(CCW) 로 표현하는 것 보다는 오른손 좌표계, 왼손 좌표계로 표현하는게 더 나을 것 같다.)

 

 

그런데 여기서 -를 곱해주는 것 때문에 저 pitch 값이 왼손 좌표계를 기준으로 회전한 각도를 의미하는 듯 보이지만,

위에서 본 rotateAroundX 메소드에서 부호가 반대였기 떄문에 결론적으로 - 를 두번 곱한 격이 되어서

 

결론적으로는 오른손 좌표계에서의 회전을 나타내는 것이고 (저 pitch 값이) rotateAroundX 메소드는 왼손 좌표계에 맞춰져있다는 것이다.

 

분명 읽는 분들 중에 '이게 뭔 개소리지?' 라고 생각하시는 분들이 있을텐데 (글을 못써서 그런듯..)

그냥 간단히 '회전 방향이 섞여있구나..' 라고 이해하면 된다.

 

(참고로 rotateAroundY 랑 rotateAroundZ 도 동일하다)

(다시 확인해 본 결과, X 와 Z 의 경우에는 왼손 좌표계를기준으로 회전하게 설정되어 있었고, Y 의 경우에는 오른손 좌표계 기준으로 회전하게 설정되어 있었다.)

'Minecraft Forge > 기타 메모' 카테고리의 다른 글

partialTicks 에 관해 추측  (0) 2016.05.20
Vanilla Minecraft Vec3 클래스에 관해  (0) 2016.05.18
Vanilla Minecraft MathHelper 에 관해  (0) 2016.05.18
[Rendering] partialTicks  (0) 2016.04.19

댓글