본문 바로가기
vfxai 잡학지식 vfxai 잡학지식

FLIP 물이 튀다 사라질 때: CFL 조건으로 서브스텝 정하기

vfx 잡학지식 읽는 시간 약 17분 조회 1

FLIP 물이 튀다 사라지거나 벽을 통과하면, 먼저 가장 빠른 입자 속도와 실제 Particle Separation으로 CFL 서브스텝을 추정하고 Max Substeps가 그 값을 허용하는지 보세요. 계산식의 h는 실제 FLIP 설정의 Particle Separation입니다. 격자 간격은 대체값이 아니라 근사치로만 쓰세요. 시작식은 n = ceil(v / (FPS × CFL × h))입니다. 다만 계산기는 출발점일 뿐입니다. 열린 메시, 얇은 충돌장, 움직이는 물체의 잘못된 속도 보간은 서브스텝을 늘려도 남을 수 있으니, 실제 충돌 시각화와 형상도 함께 확인해야 합니다.

CFL은 한 번의 업데이트가 건너뛰지 않게 나누는 기준입니다

애니메이션에서 프레임레이트가 24fps라면 한 프레임은 약 0.04167초입니다. 시뮬레이션은 그 한 프레임을 통째로 한 번에 푸는 대신 더 작은 시간 조각으로 나눠 물 입자의 위치와 속도를 갱신할 수 있습니다. 이 시간 조각 하나가 서브스텝입니다. 서브스텝을 늘린다고 최종 영상의 출력 FPS가 바뀌는 것은 아닙니다. 같은 프레임 안에서 솔버가 문제를 더 자주 계산합니다.

CFL은 각 입자가 한 서브스텝 동안 기준 간격에 비해 얼마나 멀리 움직여도 되는지 정하는 계수입니다. 복도를 일정 간격으로 표시한 뒤 한 번의 걸음이 표식 여러 개를 건너뛰지 않도록 나누는 것과 비슷합니다. 실제 입자가 바닥의 표식을 밟는다는 뜻은 아닙니다. 한 번의 업데이트 사이에 너무 먼 거리를 이동하면 충돌이나 빠른 변화가 계산에서 충분히 드러나지 않을 수 있다는 점을 거리 비율로 다룹니다.

SideFX 문서에서 CFL Condition을 0.5로 두는 예는 한 서브스텝 동안 입자가 Particle Separation의 50%를 넘게 이동하지 않도록 시간 간격을 정합니다. 0.5는 문서가 설명하는 예시이지, 모든 액체와 씬에 적용할 정답값은 아닙니다. 같은 설정이라도 입자 간격, 속도, FPS가 달라지면 프레임을 몇 조각으로 나눌지 달라집니다.

계산기로 먼저 서브스텝의 시작값을 구하세요

아래 계산기는 h에 비례해 입자가 이동할 수 있는 거리와, 속도 v에서의 최대 시간 간격을 구합니다. 한 프레임 시간은 1 / FPS이므로 그 시간을 최대 시간 간격으로 나눈 뒤 올림하면 계산상 필요한 서브스텝 수가 나옵니다.

허용 이동거리 = CFL × h

최대 시간 간격 dt_max = (CFL × h) / v

계산 최소 서브스텝 n = ceil((1 / FPS) / dt_max) = ceil(v / (FPS × CFL × h))

속도는 초당 거리, 간격은 거리, FPS는 초당 프레임이어야 합니다. 예를 들어 간격을 미터로 넣으면 속도는 m/s로 넣으세요. Houdini 씬을 센티미터 단위로 다룬다면 두 값 모두 센티미터와 센티미터/초로 맞춰야 합니다. 숫자 단위가 맞지 않으면 결과가 10배 또는 100배 차이 날 수 있습니다.

기본 예시는 속도 4m/s, 간격 0.05m, 24fps, CFL 0.5입니다. 허용 이동거리는 0.025m이고 dt_max는 0.00625초입니다. 한 프레임 0.04167초를 이 간격 이하로 나누려면 ceil(0.04167 / 0.00625), 즉 7서브스텝이 필요합니다. 7등분한 실제 시간 간격은 약 0.00595초이고, 일정한 속도를 가정한 입자 이동거리는 약 0.02381m입니다. 모두 식에서 나온 값이지 시뮬레이션을 돌려 측정한 결과가 아닙니다.

속도가 8m/s로 두 배가 되면 같은 조건에서 계산 최소값은 14로 늘어납니다. 반대로 속도가 2m/s라면 4입니다. 현재 Max Substeps를 12로 두었는데 계산값이 14라면, 그 상한으로는 계산기가 가정한 이동 제한을 만족할 수 없습니다. 실제 솔버는 장면의 속도와 설정에 따라 달라지므로 이 숫자를 그대로 품질 보증으로 읽지는 마세요.

FLIP CFL 서브스텝 추정기

속도·간격·FPS·CFL을 넣으면 한 프레임의 시간 간격과 계산상 필요한 서브스텝을 추정합니다.

값을 입력하면 추정 결과가 표시됩니다.

거리와 속도의 씬 단위를 맞추세요. Grid/Voxel 간격은 Particle Separation의 대체값이 아닙니다. SOP FLIP Solver의 Global Substeps는 Min/Max를 덮어쓸 수 있어 실제 노드 설정을 확인하세요. 이 계산기는 일정한 속도의 시작 추정치입니다.

h는 Particle Separation을 우선 사용하세요

CFL 계산에서 가장 중요한 공간 간격 h는 가능하면 FLIP Container의 Particle Separation 값으로 잡으세요. SideFX의 FLIP Solver 문서도 CFL 기준을 입자 간격으로 설명합니다. 표면에 있는 입자 평균 간격이나 화면에서 보이는 입자 크기를 임의로 재지 말고, 시뮬레이션을 만드는 노드의 실제 설정값을 사용하세요.

Particle Separation은 단지 점들의 간격만 정하지 않습니다. FLIP Container는 이 값으로 입자와 복셀 수, 충돌체의 해상도도 조절합니다. 간격을 줄이면 더 작은 형태를 표현할 여지가 생기지만 입자와 계산량이 늘고, 충돌장도 더 세밀해질 수 있습니다. 따라서 간격을 절반으로 낮추는 일은 계산기를 더 높은 해상도로 바꾸는 동시에 비용을 늘리는 선택입니다. 원하는 물결을 만들기 위해 필요하지 않은데 수치만 줄이면 시뮬레이션이 무거워질 수 있습니다.

헷갈리기 쉬운 값이 Grid Scale과 복셀 간격입니다. Grid Scale은 Particle Separation을 기준으로 이류 격자의 복셀 크기를 정하는 배수입니다. 작은 값은 격자를 더 촘촘하게 만들 수 있고 메모리도 늘 수 있습니다. 그러나 Grid Scale이 곧 Particle Separation이라는 뜻은 아닙니다. CFL 문서에서 입자 이동을 설명하는 기준과 격자 크기는 연결돼 있지만 같은 값으로 바꿔 써도 된다는 뜻이 아닙니다.

계산기에서 격자/Voxel 간격을 선택하면 그 수치를 길이 기준으로 삼는 근사값을 보여줍니다. 실제 FLIP의 설정값으로 간주하지 마세요. Particle Separation을 모르는 상황에서 계산을 가늠하는 용도입니다. 단위와 배율을 확인할 수 있다면 입자 간격을 넣고, 격자 간격만 안다면 결과를 시험의 출발점으로만 사용하세요.

계산값을 Min Substeps와 Max Substeps에 옮기는 법

Houdini FLIP Solver의 Min Substeps는 솔버가 항상 지키는 최소 서브스텝 수입니다. Max Substeps는 솔버가 넘지 않는 상한입니다. 두 값은 반대 역할을 합니다. Min Substeps를 7로 올리면 느린 프레임에도 적어도 7번 계산하게 됩니다. 반면 계산상 7이 필요한데 Max Substeps가 4라면 솔버가 7번까지 나눠 계산할 수 없습니다.

먼저 계산기의 계산 최소 서브스텝과 현재 Max Substeps를 비교하세요. 계산값이 상한보다 크면 필요한 수준까지 Max Substeps를 올려 짧은 구간을 시험할 수 있습니다. 계산값이 상한 안에 들어오면 서브스텝이 충분하다고 단정하지 말고 충돌장과 입자 움직임을 확인하세요. 또 계산값이 작다고 해서 Min Substeps를 무조건 올릴 이유도 없습니다. 불필요한 하한은 매 프레임 계산량을 늘릴 수 있습니다.

DOP 네트워크에서 CFL Condition은 솔버가 시간 간격을 자동으로 정할 때 참고하는 비율이고, Particle Advection CFL은 입자의 이류 정확도에 적용되는 별도 항목입니다. 두 이름이 비슷해도 서로 같은 설정이 아닙니다. 계산기에 입력하는 값은 전체 CFL Condition과 비교하는 값이며, 두 번째 항목을 대신 조정하는 용도가 아닙니다.

Houdini 19.5의 SOP FLIP Solver에는 Global Substeps가 따로 있고, 이 값은 Minimum Substeps와 Maximum Substeps를 덮어쓸 수 있습니다. 지금 보고 있는 것이 DOP 네트워크인지 SOP 솔버인지 먼저 확인하세요. SOP에서 Global Substeps를 사용 중이라면 Min Substeps나 Max Substeps만 바꿨다고 생각한 값이 적용됐는지 가정하지 말고, 같은 노드의 서브스텝 설정을 다시 확인하세요. 서브스텝을 늘리면 계산 시간도 늘어납니다.

벽을 통과한다면 먼저 솔버가 보는 충돌체를 확인하세요

물 입자가 벽 너머로 새는 것을 보고 곧바로 CFL Condition을 낮추거나 Max Substeps를 크게 바꾸기 쉽습니다. 하지만 FLIP은 화면에 렌더되는 유리병이나 벽의 겉모양이 아니라 충돌 계산에 전달된 충돌 형상과 볼륨을 사용합니다. 렌더 형상이 멀쩡하더라도 솔버 쪽 충돌장이 비어 있거나 얇게 만들어졌다면 같은 벽으로 취급하지 않을 수 있습니다.

첫 번째 단계는 충돌 표현이 실제로 존재하는지 보는 것입니다. DOP 기반 FLIP Solver에서는 Collision과 Collision Velocity 시각화를 켜고, SOP 기반 솔버에서는 Visualization > Show Collision을 확인하세요. 프레임을 재생하기 전에 물이 닿는 문제 구간으로 가서 표시된 충돌체가 벽과 같은 위치에 있는지 봅니다. 벽이 보이지 않거나 프레임마다 모양이 튄다면 우선 입력 연결, 충돌 모드, 변형 형상의 보간을 확인해야 합니다.

두 번째는 형상의 두께와 닫힘 상태입니다. SideFX는 닫히지 않은 충돌 메시나 구멍, 아주 작은 물체, 얇은 충돌체에서 누수가 생길 수 있다고 안내합니다. 얇은 유리벽처럼 벽 두께가 입자나 충돌 격자 해상도에 비해 작으면, 시뮬레이션이 벽을 충분한 장벽으로 표현하지 못할 수 있습니다. 메시의 구멍을 닫고, 충돌용으로 더 두꺼운 proxy 형상을 만들거나 충돌 SDF를 더 잘 표현하도록 해상도를 조정해 보세요. 렌더용 병은 그대로 두고 시뮬레이션용 충돌체만 두껍게 만드는 방법도 있습니다.

충돌 모드도 형상에 맞아야 합니다. SideFX 문서는 닫힌 3D 형상에는 보통 Volume Collide와 Surface Collide를 함께 쓰고, 2D 표면에는 Surface Collide가 맞다고 구분합니다. 볼륨만 충돌 입력으로 쓸 때는 Volume Collide 설정을 확인하세요. 잘못된 방법을 골랐다면 단순히 서브스텝을 늘려도 필요한 충돌 표현이 만들어지지 않습니다.

Particle Separation을 크게 해 해상도를 낮췄을 때만 물이 새기 시작한다면 충돌 해상도도 함께 거칠어졌는지 보세요. FLIP Container의 입자 간격은 충돌 객체의 볼륨 해상도에도 영향을 줍니다. 이때 해상도를 올리는 선택은 실제 비용을 높일 수 있습니다. 얇은 벽 전체를 고해상도로 처리하는 대신, 충돌에 필요한 두께를 갖춘 proxy로 해결할 수 있는지 먼저 살펴보세요.

움직이거나 변형되는 collider는 속도와 서브프레임을 함께 봅니다

정지한 병에 물을 채울 때는 멀쩡한데 병이 기울거나 움직이는 순간 입자가 벽을 통과한다면, 충돌체의 위치뿐 아니라 속도도 확인해야 합니다. SideFX는 움직이는 충돌 객체의 정확한 속도가 FLIP에 중요하며, 잘못된 충돌 속도가 물의 움직임을 약하게 하거나 누수로 이어질 수 있다고 설명합니다.

움직이거나 변형하는 FLIP Collide 입력에서 Compute Velocity가 맞게 설정됐는지 보고, Velocity Substeps가 빠른 움직임을 따라갈 수 있는지 확인하세요. SideFX는 빠른 입자나 움직이는 충돌체가 원인일 때 SOP FLIP Solver의 Global Substeps를 한 번에 1씩만 올려 시험하고, 움직이는 충돌체에는 Velocity Substeps도 늘리라고 안내합니다. 보통 두 서브스텝 설정은 맞춰 확인합니다. 여러 개를 한꺼번에 크게 바꾸면 무엇이 개선됐는지 구분하기 어렵습니다.

변형하는 표면은 중간 시간에도 올바른 형태로 보간돼야 합니다. 정수 프레임 위치만 맞고 프레임 사이 형상이 비거나 뒤틀리면, 서브스텝이 늘어도 솔버가 보는 충돌체가 잘못될 수 있습니다. 타임라인에서 정수 프레임 고정을 끄고 서브프레임으로 이동해 충돌 메쉬가 자연스럽게 이어지는지 확인하세요. 이 확인은 충돌체가 빠르게 움직이는 프레임에서 특히 중요합니다.

계산기에 넣는 v는 평균값보다 문제 프레임에서 가장 빠르게 움직이는 의미 있는 입자 속도에 가깝게 잡으세요. 평균 속도만 넣으면 소수의 빠른 물줄기나 튀는 입자의 이동을 과소평가할 수 있습니다. 반대로 collider가 움직이는 문제는 입자 속도를 계산하는 도구 하나로 끝나지 않습니다. 충돌체의 속도 샘플링과 Velocity Substeps를 별도로 확인해야 합니다.

입자가 사라진 것과 충돌 누수를 구분하세요

FLIP에서 점 입자 수가 줄었다고 곧바로 물이 소실됐다고 볼 수는 없습니다. SOP FLIP의 물이 FLIP Container 경계에 도달하면 경계 바깥으로 나간 입자는 삭제될 수 있습니다. 유체가 계산 영역 밖으로 빠져나간 것인지, 벽을 통과한 것인지 문제 프레임에서 위치를 확인하세요. 경계에 닿은 직후 사라지는 패턴이라면 충돌보다 컨테이너와 도메인 크기를 먼저 확인해야 합니다.

Enable Particle Narrow Band가 켜진 시뮬레이션은 표면 근처의 좁은 띠에 입자를 유지하고 그 안쪽의 입자를 제거해, 유체 내부를 볼륨이나 속도장으로 표현할 수 있습니다. 따라서 내부 입자 점이 보이지 않는 것과 액체 부피가 없어지는 것은 다른 현상입니다. 입자 표시와 표면 메쉬, 시뮬레이션 결과를 각각 확인하고, 어떤 표현에서 사라졌는지 분리하세요.

다음처럼 증상별로 첫 점검 지점을 정하면 불필요한 재시뮬레이션을 줄일 수 있습니다.

보이는 현상먼저 볼 곳다음 조치
입자가 정지한 얇은 벽을 통과함Show Collision, 충돌체의 닫힘·두께·SDF구멍을 닫고 proxy 두께나 충돌 해상도 확인
움직이는 병에서만 새거나 물이 덜 밀려남충돌 속도, Velocity Substeps, 서브프레임 보간중간 프레임에서 형상과 속도 확인
유체가 특정 공간 경계에서 사라짐FLIP Container의 경계·도메인시뮬레이션 영역과 유체 이동 범위 비교
내부 점이 사라졌지만 표면 부피는 유지됨Narrow Band와 입자/볼륨 표시 방식입자 수만으로 소실을 판정하지 않기

한 번에 하나씩 바꾸고 같은 프레임을 비교하세요

작업 순서는 다음처럼 잡으세요. 먼저 물이 벽을 통과하는 문제 프레임과 물의 속도, Particle Separation, FPS를 기록합니다. 계산기로 dt_max와 서브스텝 시작값을 확인하고, 현재 Max Substeps 또는 SOP의 Global Substeps가 계산값보다 낮은지 비교하세요. 이 단계는 기준을 세우는 일이지 성공을 보장하는 단계가 아닙니다.

그다음 Show Collision 또는 Collision 시각화로 솔버가 보는 장벽을 확인하세요. 얇거나 열린 곳이 보이면 메시와 충돌용 형상을 먼저 고치고, 속도가 빠른 움직이는 물체라면 subframe과 Velocity Substeps를 확인합니다. 그 뒤에도 충돌이 누락되는 프레임에서만 전역 서브스텝을 1씩 늘려 다시 계산해 보세요. 테스트마다 캐시를 초기화하고 같은 프레임을 비교하면 이전 설정의 결과와 섞이지 않습니다.

성공 여부는 숫자가 아니라 문제 장면으로 판정하세요. 벽을 통과하던 입자가 충돌하는지, 물줄기가 지나가야 할 방향으로 흐르는지, 잘못된 프레임에서만 물이 사라지지 않는지 확인하세요. 표면 메쉬만 보면 좁은 물줄기나 작은 방울을 놓칠 수 있으므로 입자 표시도 같이 보세요. 계산에 필요한 상한을 늘렸지만 모양이 달라지지 않는다면 CFL만의 문제가 아닐 수 있습니다. 충돌체의 두께와 속도, 영역 경계, 표면 생성 단계 중 어디서 끊겼는지 다시 나눠 보세요.

계산으로 정할 수 있는 것은 한 스텝이 이동할 거리와 그에 맞는 시간 간격의 출발값입니다. CFL로 서브스텝을 가늠한 뒤, 누수는 충돌체와 속도에서 확인하세요.

vfx 잡학지식

함께 보면 좋은 글

댓글 0

첫 댓글을 남겨보세요.