개요

후디니에서 두 벡터 사이의 거리(Distance) 값을 측정하고 다루는 함수들을 소개하고자 합니다.

  • Length()
  • Distance(,)
  • nearpoint(,)

Houdini-Beginner

함수를 사용하기 위해 준비가 필요합니다. 원점을 중심으로 회전 운동을 하는 포인트를 만들어줄 것입니다.

// hscript 방식
cos($FF), 0, sin($FF);
// Vex 방식
float speed = @Frame * 0.1; // 원하는 만큼 속도를 조절할 것
@P = set(cos(speed), 0, sin(speed));

Houdini-Beginner

포인트의 위치를 편하게 정할 수 있도록 hscript 방식으로 작성할 것입니다.

‘add1’ 노드의 ‘Point 0’ 파라미터의 ${x}$,${z}$값에 회전 행렬을 사용합니다. $FF 변수는 후디니 hscript 문법에서 현재 프레임 값을 의미합니다.

따라서 후디니에서 애니메이션을 재생하면 현재 프레임 값이 회전 행렬에 대입되고, 그렇게 계산된 ${xz}$ 평면에서 포인트 위치 값을 알 수 있습니다.

float l = length(vector);
float d = distance(vector, vector);
  • length 는 벡터의 크기 입니다.
  • distance 는 두 벡터 사이의 거리 입니다.

Vex의 length, distance 는 hlsl 문법과 동일하게 동작합니다.

응용하기

길이(Length), 거리(Distance) 함수

Houdini-Beginner

vector a = point(0, "P", 0);
vector b = point(1, "P", 0);
vector c = point(2, "P", 0);

f@dist = distance(a, b);
f@length = length(a - b);
  • a는 ${(cos, 0, sin)}$ 에 위치하고 있습니다.
  • b는 ${(1, 0, 0)}$ 에 위치하고 있습니다.
  • c는 ${(0, 0, 0)}$ 원점에 위치하고 있습니다.

a 가 회전하면서 b 와 가까워질수록 f@dist 값은 감소하며 완전히 겹치면 ${0}$이됩니다.
반대로 멀어질 수록 f@dist 값은 증가하며 가장 멀리 있을 때는 ${2.0}$ 이 됩니다.

f@length 값도 f@dist와 동일한 값이 나옵니다. 왜냐하면 a에서 b를 뺄셈하면 벡터 a의 꼬리에서 벡터 b의 머리까지의 크기와 방향을 가지는 새로운 벡터가 생성됩니다.

이를 Head to tail 이라고 합니다.

Houdini-Beginner

removepoint("주소", '포인트 인덱스');

removepoint(,) 함수를 이용하면 원하는 포인트를 제거할 수 있습니다.

vector a = @P;
vector b = point(1, "P", 0);

f@dist = distance(a, b);

if(f@dist < chf("limit"))
{
    removepoint(0, @ptnum);
}

limit 값보다 f@dist가 더 작으면 해당하는 모든 포인트를 제거하도록 코드를 작성했습니다. // f@dist 값의 응용은 무궁무진하여 @Cd 등의 포인트 컬러 값으로 사용할 수도 있을 것입니다.

Houdini-Beginner

f@dist 값을 사용해서 a 와 가장 가까운 포인트를 찾아낸 다음 가장 가까운 포인트의 인덱스 넘버가 ${0}$이 되도록 정렬할 수 있습니다.

if문을 제거한 다음, 소트(Sort) 노드를 추가합니다. 노드의 ‘Point Sort’ 파라미터 값을 By attribute 로 설정하고 dist 값을 받아옵니다.

Houdini-Beginner

dist 값이 가장 작은 순서대로 포인트 인덱스가 새롭게 정렬됩니다. 그래서 가장 가까운 포인트의 인덱스는 항상 ${0}$이 됩니다.

블라스트(blast) 노드를 사용하여 가장 가까운 포인트 인덱스 ${0}$번을 떼낸 다음 ‘By Group’으로 선으로 이어주면 위와 같은 연출을 만들 수 있습니다.

니어 포인트(nearPoint) 함수

nearpoint("주소", '포인트 포지션')

앞서 가장 가까운 포인트를 소트(Sort) 노드를 응용하여 찾아봤습니다. 그런데 Vex의 내장 함수중에 같은 기능을 하는 nearpoint(,) 함수가 있습니다.

Houdini-Beginner

int pointNumber = nearpoint(1, @P);
vector pos = point(1, "P", pointNumber);

addpoint(0, pos);

nearpoint(,) 함수는 @P의 위치와 가장 가까운 포인트의 포인트 넘버를 반환합니다.

레퍼런스(Reference)