간단하게 포스팅을 남기려고 합니다.
제목 그대로 버텍스 간 거리 구하기 입니다. 아니 정확히는 두개의 point3 사이의 거리를 구하는 방법을 소개해 드릴까 합니다.
그리고 용용 편으로 두 점사이의 어떤 특정 위치의 점의 좌표를 구하는 방법도 함께 알려 드리도록 하겠습니다.
어떤 물체가 점 A 로 부터 점 B 까지 움직이거나 A,B 사이의 특정위치를 알기 위한 계산을 하려면 필수적인 연산인데요.
예를들면 점 A 와 점 B 의 한 가운데가 되는 위치, 또는 점 A 로부터 점 B 까지의 0.2 정도 의 위치를 계산 하는 방법을 소개해 드릴까 합니다.
점과 점사이의 거리 구하기
점과 점 사이의 거리는 max script 에서는 아주 간단하게 구할 수 있답니다. 기본 명령어가 있기 때문인데요.
그림과 같이 박스 2개가 있는 경우 정 가운데 새로운 박스를 하나 만들어야 할 경우 사용하면 됩니다.
물론 저는 예를 box 로 들었지만 개체 A 의 어떤 점과 개체 B 의 어떤 점 사이의 위치를 구할때 동일하게 사용할 수 있는 예제 입니다.
boxA = $Box01
boxB = $Box02
ptA = boxA.center
ptB = boxB.center
distAB = distance ptA ptB -- 두점 사이의 거리를 계산한다.
간단하져?
distance 라는 명령을 이용하여 간단하게 두 점 사이의 거리를 구할 수 있습니다.
이제 정 가운데의 위치를 알아 볼까요?
공간상에서 위치를 이동시킨 값을 얻는 방법은 아래와 같습니다.
- 최초 시작위치 + (이동할 방향 * 이동할 거리)
여기서 이동할 방향은 vector 라는 생소한 개념인데요. 나중에 설명을 드리도록 하겠습니다. 일단 vector 라고 하면 방향+거리 라고 간단하게 생각하시면 되겠습니다.
위의 예제를 활용하여 정중앙의 위치를 찾아보겠습니다.
boxA = $Box01
boxB = $Box02
ptA = boxA.center -- boxA 의 중앙 위치 (point3)
ptB = boxB.center -- boxB 의 중앙 위치 (point3)
distAB = distance ptA ptB -- 두점 사이의 거리를 계산한다.
-- 두점 사이의 정 가운데 위치를 찾아보자.
-- ptA --> pt2 방향으로 distAB / 2 한만큼 이동한 위치를 찾아보자
vector = ptB - ptA -- ptA -> ptB 방향 : ptB - ptA
vector = normalize(vector) -- normalize 를 이용하여 벡터(방향+거리) 에서 거리 개념을 제거한다.
ptC = ptA + (vector * (distAB / 2)) -- 시작위치 + (방향 * 이동할 거리)
boxC = box()
boxC.pos = ptC -- 새로 만들어진 boxC 의 위치를 구해진 정중앙으로 변경
요렇게 실행해 보면 아래와 같이 새로운 박스가 생성 됩니다.
네 간단하죠? 실제로 제가 아주 많이 사용하는 계산 식으로 사용자 함수로 만들어 놓고 사용한답니다. 물론 정중앙이 아닌 1/3 지점, 아니면 어떤 위치도 설정이 가능합니다.
-- ptA --> pt2 방향으로 ratio 한만큼 이동한 위치를 돌려주는 함수
fn getPointBy2Point ptA ptB ratio =
(
distAB = distance ptA ptB
vector = normalize(ptB - ptA) -- 벡터(방향+거리) 에서 거리 개념을 제거한다.
ptC = ptA + (vector * (distAB / 2)) -- 시작위치 + (방향 * 이동할 거리)
return ptC
)
이런식으로 만들어서 사용하는데요. 실제 사용할 때는 아래와 같이 사용하게 됩니다.
-- ptA --> pt2 방향으로 ratio 한만큼 이동한 위치를 돌려주는 함수
fn getPointBy2Point p1 p2 ratio =
(
distAB = distance p1 p2
vector = normalize(p2 - p1) -- 벡터(방향+거리) 에서 거리 개념을 제거한다.
p3 = p1 + (vector * (distAB * ratio)) -- 시작위치 + (방향 * 이동할 거리)
return p3
)
boxA = $Box01
boxB = $Box02
ptA = boxA.center
ptB = boxB.center
ptC = getPointBy2Point ptA ptB 0.75 -- 위에서 작성된 함수를 이용하여 간단히 위치 계산
boxC = box()
boxC.pos = ptC
실행해 보면 두 박스 사이의 0.75 정도의 위치에 새로운 박스가 생성된 것을 알 수 있습니다.
위에서 만들어 놓은 함수를 이용하여 점 A 로부터 점 B 방향으로 1.0 이 넘으로 B 보다 더 멀리에 위치한 점을 얻을 수 있고요. 코드를 조금 수정하면 ratio 대신 직접 거리를 넣는 것도 간단히 구현할 수 있습니다.
공간상의 자동화 작업을 할 때 아주 자주 사용되는 기능이므로 저처럼 함수로 만들어 놓고 사용하셔도 좋겠습니다.
이만 오늘의 포스팅을 마치도록 하겠습니다.
'DEV > MAX SCRIPT' 카테고리의 다른 글
[3ds max script] vector 에 대하여 (2) | 2021.02.26 |
---|---|
[3ds max script] 카메라 생성, 이동 시키기 (14) | 2021.02.26 |
3DS MAX 스크립트, 프라퍼티 와 매소드 이해하기 (0) | 2021.02.24 |
3DS MAX 스크립트로 개체 선택하기 (6) | 2020.04.29 |
3DS MAX SCRIPT 강좌?? 무작정 시작하기 - 디자이너 추천 (12) | 2019.12.16 |