본문으로 건너뛰기

안동민 개발노트

본문 시작

기본 수학 함수와 벡터 연산

산술·삼각·클램프 함수와 벡터 생성·분해·정규화·내적·외적을 조합해 위치와 속도 변화를 계산합니다.

나이아가라 스크립트의 기본 개념을 확인했으므로, 이번 절에서는 파티클 움직임과 속성 변화를 계산하는 기본 수학 함수와 벡터 연산을 다룹니다.

위치, 속도, 색상, 크기 같은 속성은 숫자로 표현되며, 이 값을 연산해 파티클 변화를 제어합니다.

나이아가라의 스크립트 에디터는 다양한 수학 노드와 벡터 연산 노드를 제공하여, 코딩 없이도 복잡한 계산을 시각적으로 구현할 수 있게 해줍니다.

숫자 연산이 곧 파티클의 위치와 움직임이 된다

Niagara의 수학 노드는 값을 계산하는 데서 끝나지 않고 색, 속도, 방향, 크기 같은 파티클 속성으로 이어진다.

  1. Scalar
    Add / Multiply

    Scalar 값을 늘리거나 줄여 크기, 속도, 밝기 같은 기본 변화를 만든다.

  2. Wave
    Sine / Cosine

    Wave 반복 진동을 만들어 흔들림, 깜박임, 원형 움직임에 사용한다.

  3. Limit
    Clamp / Min / Max

    Limit 계산 결과가 너무 커지거나 작아지지 않도록 범위를 제한한다.

  4. Vector
    Length / Normalize

    Vector 방향과 거리를 분리해 이동 방향, 표면 반응, 분산을 제어한다.


기본 수학 함수 (Basic Math Functions)

단일 숫자(Float, Int) 값에 적용되는 기본적인 수학 연산입니다.

덧셈, 뺄셈, 곱셈, 나눗셈 (Add, Subtract, Multiply, Divide)

가장 기본적인 사칙연산 노드입니다.

  • 사용법: 두 개의 입력 핀을 받아 연산을 수행하고 결과를 출력합니다.
  • 예시
    • Particles.LifetimeMultiply 노드를 사용하여 파티클의 수명을 두 배로 늘립니다.
    • Particles.SpriteSizeAdd 노드를 사용하여 모든 파티클의 크기를 일정량 증가시킵니다.

사인, 코사인, 탄젠트 (Sine, Cosine, Tangent)

주로 주기적인 움직임이나 파동 효과를 만들 때 사용되는 삼각 함수입니다.

  • 사용법: 단일 Float 입력(라디안 값)을 받아 해당 함수의 값을 출력합니다.
  • 예시
    • Sine 노드에 Particles.NormalizedAge (정규화된 수명)를 곱하고, 그 결과를 파티클의 X 위치에 더하여 파티클이 좌우로 흔들리며 날아가게 합니다.
    • 불꽃이 위로 솟아오르면서 좌우로 흔들리는 Add Velocity 효과를 만들 때.

절대값 (Abs)

숫자의 부호를 제거하고 항상 양수로 만드는 함수입니다.

  • 사용법: 단일 Float 또는 Vector 입력을 받습니다.
  • 예시: 파티클의 속도 중 한 축이 음수가 될 때 (예: 아래로 떨어질 때), Abs를 적용하여 속도의 크기만 사용하고 싶을 때.

거듭제곱, 제곱근 (Power, Sqrt)

Power는 입력 값을 지정된 횟수만큼 곱하고, Sqrt는 입력 값의 제곱근을 계산합니다.

  • 사용법: Power는 두 개의 Float 입력을, Sqrt는 단일 Float 입력을 받습니다.
  • 예시
    • 파티클의 밝기를 수명에 따라 비선형적으로 변화시킬 때 Power를 사용할 수 있습니다.
    • 파티클의 밀도를 계산하는 복잡한 수식에서 Sqrt가 사용될 수 있습니다.

최소, 최대 (Min, Max)

두 개의 입력 중 더 작거나 큰 값을 선택합니다.

  • 사용법: 두 개의 Float 입력을 받아 비교합니다.
  • 예시: 파티클의 속도가 특정 값 이상으로 빨라지지 않도록 제한할 때 Min을 사용할 수 있습니다.

클램프 (Clamp)

값을 특정 최소값과 최대값 사이에 강제로 유지시킵니다.

  • 사용법: Value, Min, Max 세 개의 입력을 받습니다.
  • 예시: 파티클의 색상 값이 특정 범위(0~1)를 벗어나지 않도록 할 때, 또는 파티클의 크기가 너무 커지거나 작아지지 않도록 할 때 유용합니다.

벡터 연산 (Vector Operations)

벡터 노드는 위치, 속도, 방향, 색을 목적에 맞게 고른다

Make, Split, Length, Normalize, Dot/Cross는 수학 장식이 아니라 파티클 동작을 만드는 선택지다.

노드 계열하는 일주요 사용결과 확인
Make/Split성분을 합치거나 분리좌표, 색, 커스텀 값 구성X/Y/Z 또는 RGBA가 의도와 맞는가
Add/Multiply위치 오프셋과 힘 스케일 조정흔들림, 속도 증폭, 색 강도값이 과하게 누적되지 않는가
Length크기와 거리 계산속도 크기, 중심 거리 판정단위와 비교 기준이 맞는가
Normalize방향만 남기고 길이를 1로 만듦일정 방향 힘, 표면 노멀0 벡터 처리 기준이 있는가
Dot/Cross각도 관계와 회전축 판단방향성 분기, 회전 효과좌표계와 축 방향이 맞는가

위치, 속도, 색상 등은 2차원 또는 3차원 벡터(Vector)로 표현됩니다.

벡터 연산은 이러한 벡터 값들을 다루는 수학입니다.

벡터 연산은 목적에 맞는 노드 조합을 고르는 순간 활용도가 크게 올라갑니다.

아래 시각자료는 입력 신호를 어떤 연산으로 처리해 최종 파티클 속성으로 연결하는지 요약합니다.

벡터 생성 (Make Vector, Make Vector2, Make Vector4)

개별 Float 값을 합쳐 Vector를 생성합니다.

  • 사용법: X, Y, Z (또는 W) 입력 핀에 Float 값을 연결하여 하나의 Vector 값을 만듭니다.
  • 예시: Add Velocity 모듈에서 파티클에 원하는 방향과 크기의 속도를 부여하기 위해 X, Y, Z 값을 각각 조절할 때 사용합니다.

벡터 분해 (Split Vector, Split Vector2, Split Vector4)

Vector를 개별 Float 값으로 분해합니다.

  • 사용법: 하나의 Vector 입력을 받아 X, Y, Z (또는 W) 출력 핀으로 분리합니다.
  • 예시: 파티클의 Position에서 X 값만 가져와 특정 계산에 사용하고 싶을 때.

벡터 덧셈, 뺄셈, 곱셈, 나눗셈 (Vector Add, Subtract, Multiply, Divide)

벡터와 벡터, 또는 벡터와 Float 간의 사칙연산입니다.

각 컴포넌트(X, Y, Z)별로 연산이 수행됩니다.

  • 사용법
    • 벡터 + 벡터: 두 벡터의 각 컴포넌트끼리 더합니다. (예: Particles.Position + Particles.Velocity * System.DeltaTime으로 다음 프레임 위치 계산)
    • 벡터 * Float: 벡터의 모든 컴포넌트에 Float 값을 곱합니다. (예: 파티클의 Velocity0.5를 곱하여 속도를 절반으로 줄일 때)
  • 예시
    • Add Velocity 모듈에서 Particles.VelocityGravity Force의 힘을 더하여 최종 속도를 계산할 때.
    • 파티클의 Color 벡터에 Float 값을 곱하여 색상의 밝기를 조절할 때.

벡터 길이 (Vector Length)

벡터의 크기(길이)를 Float 값으로 출력합니다.

  • 사용법: 단일 Vector 입력을 받습니다.
  • 예시: 파티클의 속도 크기가 특정 값 이상일 때만 추가 효과를 발생시키고 싶을 때.

정규화 (Normalize)

벡터의 방향은 유지하고 길이를 1.0으로 만듭니다.

방향 벡터를 얻을 때 사용됩니다.

  • 사용법: 단일 Vector 입력을 받습니다.
  • 예시: 특정 방향으로 힘을 일정하게 적용하고 싶을 때, 방향 벡터를 Normalize하여 사용합니다.

내적 (Dot Product)

두 벡터의 내적을 계산하여 Float 값을 출력합니다.

두 벡터가 얼마나 같은 방향을 향하는지 나타냅니다.

  • 사용법: 두 개의 Vector 입력을 받습니다.
  • 예시: 파티클의 이동 방향과 특정 빛의 방향이 일치할 때만 밝아지도록 할 때.

외적 (Cross Product)

두 벡터에 수직인 새로운 벡터를 출력합니다.

3D 공간에서 회전 축 등을 계산할 때 사용됩니다.

  • 사용법: 두 개의 Vector 입력을 받습니다.
  • 예시: 특정 표면의 노멀 방향을 기반으로 파티클의 회전 축을 결정할 때.

스크립팅과 수학의 결합

이러한 수학 함수와 벡터 연산 노드들을 조합함으로써 여러분은 파티클의 동작을 매우 정교하게 제어할 수 있습니다.

아래 다이어그램은 시간값, 랜덤값, 수학 함수, 벡터 적용이 어떤 순서로 이어지는지 한 번에 보여줍니다.

수학 노드는 값 만들기, 형태 지정, 제한, 적용 순서로 조합한다

복잡한 효과도 입력값을 만들고 함수로 형태를 잡은 뒤 범위를 제한해 Particle 속성에 쓰면 관리하기 쉬워진다.

순서역할예시 노드파티클 결과
01 Input시간, 랜덤, 사용자 값을 준비NormalizedAge, DeltaTime, Random, User 값변화의 재료가 생김
02 Shape값의 곡선과 리듬을 만듦Sine, Power, Curve흔들림, 밝기 변화, 감쇠 형태
03 Limit과한 범위를 안정화Min, Max, Clamp, Saturate색과 크기가 튀지 않음
04 Convert스칼라를 벡터나 색으로 변환Make Vector, Lerp, Multiply방향, 크기, 색상으로 의미 부여
05 Apply최종 값을 속성에 씀Position, Velocity, Color, SpriteSize화면에서 동작으로 확인
  • 파동 효과: Sine 노드를 사용하여 파티클의 위치나 속도에 주기적인 변화를 줍니다.
  • 랜덤성 제어: Random 노드와 Multiply, Add 등을 조합하여 파티클의 속성에 다양한 무작위성을 부여하면서도 원하는 범위 내에서 제어합니다.
  • 동적인 크기/색상 변화: Particles.NormalizedAgeCurve 노드, 그리고 Multiply 노드를 사용하여 파티클의 크기와 색상을 수명에 따라 부드럽게 변화시킵니다.
  • 물리적 상호작용: Add Velocity, Gravity Force 등의 모듈과 함께 벡터 연산을 사용하여 파티클이 실제 물리 법칙을 따르도록 시뮬레이션합니다.

나이아가라 스크립트 에디터에서는 작은 노드 조합부터 실행 결과를 확인하며 계산 흐름을 검증해야 합니다.

아래 다이어그램은 수학 함수와 벡터 노드를 효과 목적에 맞춰 고르는 선택표입니다.

수학 함수와 벡터 노드 선택표

효과의 목적을 먼저 정하면 필요한 노드가 줄어듭니다. 움직임, 범위 제한, 방향 계산, 밝기 변화는 서로 다른 연산 패턴을 갖습니다.

  1. 흔들림과 파동

    Sine 시간이나 정규화 수명을 넣어 반복되는 위치, 크기, 색상 변화를 만듭니다. NormalizedAge -> Sine Result -> Add Position

  2. 범위 제한

    Clamp 색상, 알파, 크기가 안전한 값 밖으로 나가지 않게 고정합니다. Value, Min, Max 0.0 -> 1.0

  3. 방향만 사용

    Normalize 벡터 길이는 버리고 방향만 필요할 때 씁니다. 비용이 있으므로 남용하지 않습니다. Vector -> Normalize Direction * Speed

  4. 방향 비교

    Dot 두 벡터가 같은 방향을 보는지 검사해 조명, 정렬, 표면 반응을 제어합니다. Velocity dot Normal Result -> Select

  5. 부드러운 전환

    Lerp 두 값 사이를 알파로 섞어 수명 기반 색상, 크기, 속도 변화를 만듭니다. A, B, Alpha Age -> Alpha

  6. 벡터 계산 읽는 순서

    생성 Make Vector 축 조합 분해 Split Vector 축 추출 적용 Position + Velocity * DeltaTime 프레임 이동

  7. 방향

    필요하면 벡터 노드, 범위가 필요하면 Clamp, 시간 변화가 필요하면 Sine이나 Lerp를 먼저 검토합니다. 복잡한 함수는 결과 차이가 실제 뷰포트에서 보일 때만 유지합니다. 목적 -> 입력 타입 -> 비용 순서로 고르기

아래 다이어그램은 수학 노드를 선택한 뒤 값 범위, 단위, 정규화, 클램프를 차례로 확인하는 안전장치 흐름입니다.

수학 노드 값 범위

Sine, Normalize, Dot Product 같은 노드는 강력하지만 입력 단위와 출력 범위를 놓치면 파티클이 튀거나 사라집니다.

  1. NormalizedAge

    age NormalizedAge 수명 기반 변화는 0에서 1로 움직인다는 전제를 유지합니다.

  2. Sine / Cosine

    wave Sine / Cosine 주기 입력은 라디안 기준입니다. 속도 배율을 따로 두면 조정이 쉽습니다.

  3. Vector Length

    length Vector Length 방향 정보는 사라지고 크기만 남습니다. 발광 강도 계산에 적합합니다.

  4. Dot Product

    facing Dot Product 두 방향의 일치도를 읽습니다. 입력 벡터는 먼저 Normalize하는 편이 안전합니다.

수학 노드를 실제 이펙트에 넣을 때는 값의 종류, 단위, 범위를 먼저 고정한 뒤 속성에 연결해야 튜닝이 흔들리지 않습니다.

Niagara Float/Vector 노드 선택표

나이아가라 수학은 NormalizedAge, DeltaTime, Particles.Position, Velocity, Color처럼 입력과 출력 속성을 먼저 고정해야 예측됩니다.

  1. Add·Multiply·Clamp

    Float Lifetime, SpriteSize, Alpha는 Map Range와 Clamp로 0-1 또는 cm 범위를 고정합니다.

  2. Sine·Cosine

    Wave NormalizedAge에 주파수와 TAU를 곱해 흔들림을 만들고 라디안 입력을 유지합니다.

  3. Normalize·Dot·Cross

    Vector Safe Normalize, Vector Length, Dot Product로 방향, 속도 크기, 정면 여부를 분리합니다.

  4. Local·World 변환

    Space Transform Position/Vector로 Emitter Local과 World Space를 섞지 않게 맞춥니다.

  5. 단위 충돌

    Degree와 Radian, Unreal cm, NormalizedAge 0-1 값을 한 식에서 섞지 않습니다.

  6. 폭주 방지

    Color, Size, Velocity 출력 전 Clamp, Min/Max, Lerp로 NaN과 무한 가속을 막습니다.

  7. 속성 기록

    Scratch Pad에는 Particles.SpriteSize, Color, Velocity처럼 대상 속성명을 남깁니다.