Niagara

[Niagara/Emitter] 뒤늦게 따라오는 리본렌더러 해결방법

액터에 리본이 딱 붙게 만들수는 없을까

리본이 액터를 쫒아가는 모양이 나와서, 활용도가 매우 떨어진다. 어떻게 해결하면 좋을까

기존에 있는 리본렌더러 출력방식에 대해 알아보자

ex) Spawn Per Unit > Spawn Spacing : 30

→ Emitter가 30cm를 지날 때마다 파티클을 스폰

(30cm에 딱 도착하면 스폰안함 0.00001cm라도 이 거리를 지나가야 스폰)
→ 리본 렌더러는 각 파티클을 연결해 선을 그림 (최소 2개의 파티클은 필요)

리본렌더러의 문제점이 무엇일까

→ 보면 Emitter가 30cm를 지나갈 때마다 스폰을 하는데,

다음 거리를 지나기 전까지는 파티클이 없으니 리본을 그릴 수가 없음.

→ 그 찰나에 Emitter와 리본의 사이에 비어보이는 거리가 생김
→ 이것이 리본이 액터를 뒤늦게 따라가는 것 처럼 보이게 한다.

그럼 이제 어찌하면 좋을까. 가정을 해보자

가정1)

파티클의 포지션을 Emitter의 위치로 강제로 위치시키면 Gap이 사라지지 않을까?

그럼 촘촘하게 스폰할 필요없이, 이미터가 움직이면서 리본을 그리는 모양이 나올테니까.

문제점 > 리본은 파티클과 파티클 사이를 이어주는 렌더러인데,
모든 파티클이 이미터에 붙어버려서 리본을 그릴 수가 없음.

→ 적용 불가

가정2)

**[1. 제자리에 멈춰있는 파티클]**과 **[2. 이미터에 붙어서 움직이는 파티클]**을 구분하는 로직이 필요하다.

이러면 제자리에 멈추는 파티클을 기준으로 이미터에 붙은 파티클이 이동하면서 자연스럽게 리본을 그려줄 것이다.

→ 이걸로 결정

구현 방법

① Spacing 값 설정 (이동 거리 기준 정의)
-> 새로 추가한 <이미터 Float 파라미터>

  • Spacing이펙트가 리본을 그릴 때 사용할 간격 기준입니다.
  • Emitter가 이동하면서 파티클을 생성하는 구조이므로,
    “얼마만큼 이동했을 때 새로운 파티클을 생성할지” 기준이 필요합니다.
  • 이 값을 활용해 파티클이 생성된 이후, 그 파티클이 이동을 멈출지 (고정),
    혹은 계속 Emitter를 따라 이동할지(붙어서 움직이기)를 판단할 수 있습니다.

👉 정리: 이 값은 파티클 간격 + 파티클 이동/정지 판단 기준으로 사용됩니다.

② DistanceTraveled (Emitter의 이동 누적 거리)
-> 원래 있던 파라미터

  • Emitter의 누적 이동 거리를 나타내는 값이 DistanceTraveled입니다.

👉 정리: DistanceTraveled는 현재 이미터의 위치 (거리 기준)이며,
이미터가 움직인 총 이동 누적거리를 나타냅니다.

③ BirthDistance (파티클이 생성될 당시 Emitter 위치 기록)
-> 새로 추가한 <파티클 Float 파라미터>

  • 파티클이 생성되면, 그 순간의 Emitter 위치 (DistanceTraveled)를
    BirthDistance 변수에 저장합니다.(스냅샷)
  • 이후에 이 BirthDistance(파티클 위치 스냅샷)
    현재 DistanceTraveled(이미터의 총 누적거리)의 차이를 비교함으로써
    해당 파티클이 Emitter로부터 얼마나 떨어져 있는지를 계산할 수 있습니다.

👉 정리: BirthDistance은 각 파티클이 태어난 “지점”을 기억해 두기 위한 값입니다.
(변하지 않는 값이기에 Particle Spawn에 변수를 추가한 것)

⑤ Lerp Position을 통한 위치 결정 (파티클 이동 vs 정지)
-> 원래 있던 <Paritlce.Position> 에 Lerp Position 적용

  • Lerp(A, B, Alpha)로 파티클의 최종 위치를 계산합니다.
    • (Alpha = 0) A = SimulationPosition (이동 중인 Emitter 위치)
      → 파티클이 Emitter에 붙어서 이동한다.
    • (Alpha = 1) B = Particle.Position (현재 파티클의 위치)
      → 파티클이 현재 위치에 유지 (파티클이 갑자기 멈추는 모양으로 보임)

👉 정리: Alpha에 따라 파티클이 계속 움직이게 할지 / 멈추게 할지 제어됩니다.

④ Distance 비교를 통한 조건 판단 (D = Distance 차이)

  • D = DistanceTraveled - BirthDistance
  • (파티클 생성으로부터 움직인 Emitter의 거리)
  • (계산식이 기니까 D로 가정)
  • D값과 Spacing 값을 비교해서 Alpha값을 구합니다.

    <Bool 조건을 통한 Alpha 값 설정>
    • Alpha는 Bool 조건에 따라 True/False에 따라 0 또는 1이 됩니다.
      • [ Bool A ]D < Spacing
        → Emitter가 생성된 파티클로부터 Spacing보다 멀어지지 않음
        Alpha = 0(true)
      • [ Bool B ]D ≥ Spacing
        → Emitter가 생성된 파티클로부터 Spacing보다 멀어짐
        Alpha = 1(False)

기대효과

이미터가 이동하는 길에 파티클1 번을 스폰시킨 후 잡아서 끌고가다가
특정거리에서 파티클 1번을 정지. (Spacing 거리에 따라) 파티클 2번 스폰 후 다시 끌고감
→ 멈춰있는 파티클 1번과 끌려가는 파티클 2번 사이의 간격이 생기면서 리본렌더러가 그려진다고 보면 된다.

이렇게 구현하기 위해 특정거리를 기준으로
‘끌고가는 파티클’과 ‘멈추는 파티클’을 구분짓는 조건식을 만들어 적용함.

  • 그 결과로 리본이 Emitter 궤적에 정확하게 붙어서 그려짐
  • 우리가 문제로 삼았던, 리본과 액터의 Gap이 사라지게 되었음.

적용 결과

비교해보기

참고자료

https://realtimevfx.com/t/niagara-5-0-fix-ribbon-gap-mini-tutorial/22795/21

댓글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다