programming notes

View on GitHub

맥스에는 이동, 회전, 스케일 기즈모(gizmo)가 있다.
이런 저런 이유로 기즈모를 구현할 필요가 생겼다. (이동 기즈모만..)
그래서 구현한 방법을 올려본다. 머릿속에 있는 것을 정리할 겸..
마우스로 물체를 이동 시킬 때 임의의 축이나 임의의 평면을 기준으로 이동시킨다.(다른 방법도 있겠지만..)
여기서는 임의의 축을 기준으로 이동시키는 방법을 소개한다.
임의의 축을 기준으로 이동을 시킬 때 그 축과 평행하는 벡터를 만들어서 이동을 시킬 수 있는데,
사용자의 입력을 처리하여 최종적으로 아래 그림처럼 만들어야 사용자가 드래그한 만큼 움직이게 된다.

- 그림 1 -

여기서 문제는 2차원의 마우스 이동을 3차원 공간상의 이동으로 변환한 다음
공간상의 이동을 축과 평행한 이동으로 만들어야 한다.
이때 기준 축을 포함하는 평면을 가지고 해결할 수 있다.
아래에서는 다음의 기호를 쓸 것이다.
기준 축: A
기준 축을 포함하는 평면: P
이동시작점: X
이동끝점: Y
최종 이동 벡터: V
처음 사용자 입력 픽킹광선: R1
마지막 사용자 입력 픽킹광선: R2
V = Y-X인데
V가 A에 평행하게 하는 방법으로 X와 Y를 A에 평행하는 직선에 포함 시키면 된다.
이 X와 Y를 R1과 R2로 만들면 된다.
X는 다음과 같이 얻을 수 있다.
R1과 P의 교차점 = T를 계산하고 (직선과 평면의 교차점)
기준축상에 임의의 점 O에서 T까지의 벡터 OT라 하면
X = (OT ● A)A + O // A는 단위임
Y도 X와 같은 식으로 구면된다~
그림으로 표현하면 아래와 같을 것이다.

- 그림2 -

그럼 최종적으로 Y-X로 V를 구할 수 있다.
이런 식으로 이동벡터를 만들면 기준 축을 기준으로 마우스 움직임만큼 자연스럽게 이동시킬 수 있다.


글재주 없는 것이 머릿속에 있는 것을 글과 그림으로 표현하려니까 무진장 힘드네요.
지나가는 고수님들 지적 질 부탁염.