반응형

안녕하세요. 오늘은 디자이너라면 조금 생소할 수 있는 vector 라는 개념에 대하여 소개해 드릴까 합니다.

혹시 작년 쯤인가요? 슈퍼밴드라는 밴드 오디션 프로그램에서 F=ma 라는 곡으로 아주 인기를 끌었던 적이 있습니다. 이식은 노래 가사에도 나오듯이 F (힘) = mass (질량) * accelation (가속도) 라고 정의를 하고 있습니다. 즉 힘이라는 개념은 단순한 한가지 속성이 아닌 두가지 속성이 합쳐져서 만들어진 개념인 것이죠.

오늘 소개해 드릴 vector (벡터) 가 바로 그러 합니다. vector 는 딱히 우리말로 번역된 문구가 있는지 모르겠지만 그냥 vector 로 이해하시는 것이 빠를 것 같습니다.

먼저 벡터를 간단하게 정의하자면

Vector = Direction (방향) * length (거리) 

라고 할 수 있습니다.

벡터의 정의

 

만약 [0,10,10] 이라는 벡터가 있다면 방향은 [0.0,1.0,1.0] 거리는 10 인 벡터라는 것이죠.

방향을 나타내는 point3 좌표의 x, y, z 값에 length 인 10을 각각 곱해주면 [0,10,10] 이라는 벡터가 만들어 지는것이죠.

여기서 길이의 속성을 뺀 순수한 방향을 normal vector 라고 합니다. x, y, z 의 값이 1.0이 넘지 않도록 정규화한 값인데요. 벡터를 이용할때 매우 자주 사용되는 개념이므로 잘 이해하셔야 합니다.

 

먼저 벡터의 표현을 볼까요?

3DS MAX script 에서는 [ x , y , z ] 와 같은 point3 좌표와 동일한 형태로 표현합니다.

max script 에서 point3는 점의 좌표이기도 하지만 [ 0 , 0 , 0 ] 으로 부터의 방향과 거리가 담긴 벡터이기도 한것이죠.

두 점 사이의 벡터를 구하는 방법은 아래와 같습니다. 점 A 로부터 점 B 까지의 벡터는 아래와 같습니다.

vector = pointB - pointA

벡터의 표현

어떤 점 P1 로부터 어떤 점 P2 까지의 벡터가 있다고 했을때 그 방향으로 지정한 거리만큼 이동된 제 3의 좌표를 구하려면 normal vector 가 필요합니다. max script 에서는 nomalize 라는 명령어로 vector 에서 방향 성분만 추출된 normal vector 를 얻을 수 있습니다.

먼저 두 점을 이용하여 vector 를 구하는 방법은 위에서 소개한 바와 같이 아래와 같이 스크립트로 표현됩니다. 

vec_p1p2 = p2 - p1

vec_p1p2 = p2 - p1

간단하죠? 도착점의 좌표에서 시작점의 좌표를 빼주면 됩니다. 

그리고 normal vector 를 구하는 방법은 아래와 같습니다.

normalVec_p1p2 = normalize(vec_p1p2))

 

요렇게 하면 normalVec_p1p2 라는 변수에 구해진 벡터의 노멀라이징된(정규화된) 벡터를 얻을 수 있습니다.

 

우리가 이제 방향을 알았다면 해당 방향으로 이동된 어떤 거리의 점의 위치를 얻을 수 있습니다.

구하는 방법은 아래와 같습니다.

최종 위치 = 시작위치 + (방향 * 거리)

벡터를 이용한 점의 위치 계산 방법

그림으로 보면 이런식입니다.

위에서 사용했던 스크립트를 이용해보면 

distance = 100

vec_p1p2 = p2 - p1

normalVec_p1p2 = normalize(vec_p1p2))

resultPos = p1 + (normalVec_p1p2 * distance )

이렇게 되겠죠.

Distance 가 - 가 되면 반대 방향으로 이동을 하게 됩니다.

Distance 를 p1 과 p2 사이의 거리를 구한다음 절반에 해당하는 거리를 부여하면 두 점사이의 중간에 해당하는 지점의 위치를 구할 수 있습니다. 

2021/02/24 - [DEV/MAX SCRIPT] - 3da max script 점과 점 사이의 거리 구하기

 

3da max script 점과 점 사이의 거리 구하기

간단하게 포스팅을 남기려고 합니다. 제목 그대로 버텍스 간 거리 구하기 입니다. 아니 정확히는 두개의 point3 사이의 거리를 구하는 방법을 소개해 드릴까 합니다. 그리고 용용 편으로 두 점사

diy-dev-design.tistory.com

이런식으로 두점 사이를 일정 간격으로 등분 할때도 사용할수 있고요. 

물체의 거리, 방향들을 바꾸어 주면서 연속해서 변화를 줄 경우 간단하게 2D 자동차 게임 같은 것을 만드는게 가능한거죠. 가속 페달 버튼을 누르면 매 프레임 당 이동하는 거리를 바꾸어 주면 되고 좌우 핸들 방향을 조절하면 normal vector 의 방향을 바꾸어 주면 됩니다.

방향과 길이를 조정하면서 이동된 점의 위치

이해 되시나요? 

 

사실 공간상의 이동 및 좌표 계산에 vector 는 빠질 수 없는 개념입니다.

 

 

 

예를 들어 세 점의 각도를 구해봅시다. 2D 좌표 안에서 각도를 구하는 것은 중학교 수학 정도를 잘 배웠다면 직접 계산 하는 것도 가능하긴 합니다. 그럼 3D 에서는요? 그냥 생각해도 쉽지 않겠죠 ?

그래서 max script 간단하게 세점의 각도를 구하는 방법을 소개해 드릴까 합니다.

p1
p2 -- 축이 되는 점
p3

vec01 = normalize ( p2 - p1 )
vec02 = normalize ( p2 - p3 )

angle = acos( dot (vec01, vec02))

이렇게 하면 간단하게 angle 을 구할 수 있습니다.

수많은 점을 가지고 있는 곡선 (폴리라인)의 점을 minimalize (단순화) 할 경우에도 연속된 세점의 각도를 측정하고 지정한 각도 미만일 경우 점을 삭제 하여 단순화 하는 기능에 적용할 수 있으며 지면으로 부터의 현재 벡터의 각도 등을 측저한다든가 하는 여러가지 응용을 할 수 있습니다.

 

벡터를 알면 어떤 직선에 수직이 되는 방향도 쉽게 구할 수 있습니다.

vecA = normalize ( p2 - p1 )

vecA1 = [ vecA.y , - vecA.x , vecA.z ]

--또는 

vecA2 = [ - vecA.y , vecA.x , vecA.z ]

와 같이 하면 vecA1 과 vecA2 는 vecA 의 수직이 되는 벡터가 되는데요 vecA1 과 vecA2 에 - 가 붙은 위치가 다른데 각각 기준이 되는 벡터의 오른쪽 과 왼쪽 벡터가 됩니다.

이는 직선의 방정식을 생각해보면 단순한 원리임을 알수 있습니다.

직선에 수직 성분을 갖는 다른 직선 --> 수직 벡터로 응용할 수 있다

어떤 직선을 기준으로 양쪽으로 확장되는 두께 등을 다이나믹하게 설정해야 하는 경우, 예를 들면 라인을 폴리곤으로 변경할 때 유용하게 사용될 수 있습니다.

기준이 되는 벡터의 양쪽으로 확장할 때 사용 가능

 

벡터를 응용함에 있어 중요한

벡터의 합

벡터의 합

 

응용을 해보면 직선상의 3점을 이용하여 어떤 점이 중간에 있는 점인지 알아내는 것에도 vector 연산을 이용하면 쉽게 할 수 있습니다.

점 A, B, C 가 있다고 했을 때 선분 AB, AC 또는 선분 BA, BC 등을 구해서 노멀 벡터를 구한 뒤 두개의 노멀 벡터를 더했을 때 [0,0,0] 이 나오면 해당 점이 중간에 있는 점인 것이죠. 

 

이상으로 간단하게 3DS Max 에서 사용되는 벡터의 개념에 대하여 알아 보았습니다. 

추가가 필요하다고 판단되는 내용이 생각나면 업데이트 하도록 하겠습니다.

문의하실 내용이 있으시면 뎃글로 남겨주시면 감사하겠습니다.

 

그럼 이만

 

2021/02/26 - [DEV/MAX SCRIPT] - [3ds max script] 카메라 생성, 이동 시키기

 

[3ds max script] 카메라 생성, 이동 시키기

오늘 다룰 주제는 맥스의 카메라 와 뷰포트 입니다. 3D 공간의 개체를 보여주기 위하여는 카메라 라고 하는 가상의 개체가 필요합니다. 카메라에 보여지는 대상을 이미지화 하여 사용자에게 보

diy-dev-design.tistory.com

2021/02/24 - [DEV/MAX SCRIPT] - 3da max script 점과 점 사이의 거리 구하기

 

3da max script 점과 점 사이의 거리 구하기

간단하게 포스팅을 남기려고 합니다. 제목 그대로 버텍스 간 거리 구하기 입니다. 아니 정확히는 두개의 point3 사이의 거리를 구하는 방법을 소개해 드릴까 합니다. 그리고 용용 편으로 두 점사

diy-dev-design.tistory.com

2019/12/16 - [DEV/MAX SCRIPT] - 3DS MAX SCRIPT 강좌?? 무작정 시작하기 - 디자이너 추천

 

3DS MAX SCRIPT 강좌?? 무작정 시작하기 - 디자이너 추천

개발이라 하면 두드러기가 나는 디자이너 들이 있습니다. 아니 대부분 그렇죠. 이글을 읽고 계신 본인도 그러하다면, 그런데 스크립트로 무언가를 하고 싶다면 어쩌겠습니까.. 배워야지요. 그래

diy-dev-design.tistory.com

 

 

 

 

 

반응형

+ Recent posts