개요
후디니에서 삼각함수가 그리는 파동의 진폭을 제어하는 두 가지 함수 clamp(,,)와 fit(,,,,) 에 대해서 소개하고자 합니다.
clamp(y, 'y의 최솟값', 'y의 최대값');
fit(y, 'y의 최솟값', 'y의 최대값', 'y의 진폭 최솟값', 'y의 진폭 최대값')함수를 사용하기 위해 준비가 필요합니다. 다음과 같은 코드를 작성해주세요.

float x = @P.x;
float y = sin(x * abs(beta) + gamma) * alpha + delta;
@P = set(x, y, 0);
- ${\alpha}$(알파)는 진폭을 조절 합니다.
- ${\beta}$(베타)는 파장을 조절 합니다.
- ${\gamma}$(감마)는 그래프를 수평이동 합니다.
- ${\delta}$(델타)는 그래프를 수직이동 합니다.
클램프(clamp) 함수

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) 함수

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}$의 최대값으로 잘라낸 다음 outMin 과 outMax 값에 맞춰 진폭을 늘리고 줄이는 함수입니다.
연산 순서가 중요한데요, min, max가 먼저 적용되고 난 다음에 outMin 과 outMax가 적용됩니다.

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

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(,,,,) 는 빨간색으로 출력해서 겹쳐놓고 비교해봅니다.

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)
- TWA 후디니의 정석 : https://www.youtube.com/@TWAHOUDINI
- 게임 수학 입문 - 삼각함수 : https://walll4542developer.github.io/math/Trigonometric-functions
- Vex : https://www.sidefx.com/docs/houdini/vex/index.html
- 나무위키/파동 : https://namu.wiki/w/%ED%8C%8C%EB%8F%99