개요

후디니에서 삼각함수가 그리는 파동의 진폭을 제어하는 두 가지 함수 clamp(,,)fit(,,,,) 에 대해서 소개하고자 합니다.

clamp(y, 'y 최솟값', 'y 최대값');
fit(y, 'y 최솟값', 'y 최대값', 'y 진폭 최솟값', 'y 진폭 최대값')

함수를 사용하기 위해 준비가 필요합니다. 다음과 같은 코드를 작성해주세요.

Houdini-Beginner

float x = @P.x;
float y = sin(x * abs(beta) + gamma) * alpha + delta;

@P = set(x, y, 0);

Houdini-Beginner

  • ${\alpha}$(알파)는 진폭을 조절 합니다.
  • ${\beta}$(베타)는 파장을 조절 합니다.
  • ${\gamma}$(감마)는 그래프를 수평이동 합니다.
  • ${\delta}$(델타)는 그래프를 수직이동 합니다.

클램프(clamp) 함수

Houdini-Beginner

float a = point(0, "y", @ptnum); // "y"는 sin 그래프

float min = chf("min");
float max = chf("max");

float x = @P.x;
float y = clamp(a, min, max);

@P = set(x, y, 0);

clamp(,,) 함수는 min을 ${y}$의 최솟값으로, max를 ${y}$의 최대값으로 잘라내는 함수입니다.

Vex 언어에서는 hlsl 처럼 saturate() 함수가 없어서 대신 clamp(,,)를 사용해야 합니다.

핏(fit) 함수

Houdini-Beginner

float a = point(0, "y", @ptnum);

float min = chf("min");
float max = chf("max");
float outMin = chf("outMin");
float outMax = chf("outMax");

float x = @P.x;
float y = fit(a, min, max, outMin, outMax);

@P = set(x, y, 0);

fit(,,,,) 함수는 min을 ${y}$의 최솟값으로, max를 ${y}$의 최대값으로 잘라낸 다음 outMinoutMax 값에 맞춰 진폭을 늘리고 줄이는 함수입니다.

연산 순서가 중요한데요, min, max가 먼저 적용되고 난 다음에 outMinoutMax가 적용됩니다.

Houdini-Beginner

outMinoutMax 값에 맞춰 진폭을 늘리고 줄이기 때문에, outMax 값이 outMin 값보다 작아지는 경우에는 그래프가 ${y}$축 방향으로 반전됩니다.

응용하기

Houdini-Beginner

float x = @P.x;
float y = noise(x * abs(beta) + gamma) * alpha + delta;

@P = set(x, y, 0);
f@y = y;
@Cd = {0, 0, 1};

눈으로 보기 편하도록 noise() 함수에 포인트 컬러 어트리뷰트(attribute)를 추가해서 파란색으로 출력 하고 clamp(,,)fit(,,,,) 는 빨간색으로 출력해서 겹쳐놓고 비교해봅니다.

Houdini-Beginner

float x = @P.x;
float a = point(0, "y", @ptnum);

float min = chf("min");
float max = chf("max");
float outMin = chf("outMin");
float outMax = chf("outMax");

float y = fit(a, min, max, outMin, outMax);
// float y = clamp(a, min, max);

@P = set(x, y, 0);
@Cd = {1, 0, 0};

레퍼런스(Reference)