Houdini · DOP Network

마이크로 솔버 사전

Pyro Solver 하나를 열어보면 그 안에 Gas 로 시작하는 노드가 수십 개 들어 있습니다. 그것들이 마이크로 솔버입니다. 시뮬레이션 한 걸음을 잘게 쪼개 한 조각씩 맡은 부품들이죠. 36개를 파라미터 하나하나까지 풀어 정리했습니다. 값은 Houdini 20.5 실제 노드에서 뽑았습니다.

시뮬레이션 한 걸음은 이렇게 굴러갑니다

연기든 물이든, 컴퓨터는 한 프레임에서 다음 프레임으로 가는 계산을 반복할 뿐입니다. 그 한 걸음이 아래 순서로 나뉘고, 각 칸을 담당하는 노드가 따로 있습니다.

01
힘을 더한다
뜨거우면 위로, 바람이 불면 옆으로. 속도를 바꿉니다.
02
실어 나른다
그 속도를 따라 연기와 물을 실제로 옮깁니다.
03
압력을 푼다
한곳에 뭉치거나 구멍이 나지 않도록 속도를 손봅니다.
04
부딪힘을 처리한다
벽을 뚫고 지나가지 못하게 막습니다.
05
정리한다
연기는 옅어지고, 값은 범위 안으로 다듬어집니다.

이 다섯 걸음이 1초에 24번, 서브스텝까지 치면 그보다 몇 배 더 반복됩니다. 마이크로 솔버를 하나 끼워 넣는다는 건, 이 반복되는 순서 어딘가에 내 계산을 한 줄 끼워 넣는 일입니다.

어느 입력에 꽂느냐가 절반입니다

Smoke Solver 와 Pyro Solver 에는 마이크로 솔버를 꽂는 입력이 네 개 있습니다. 같은 노드라도 어디에 꽂느냐에 따라 결과가 완전히 달라집니다. 한 입력에 여러 개를 꽂으면 왼쪽에서 오른쪽 순서로 실행됩니다.

입력 1
Pre-solve

매 걸음이 시작되기 전에 실행됩니다. 필드를 미리 만들어두거나 초기화할 때 씁니다.

입력 2
Velocity update

압력 계산 전에 속도를 건드립니다. 힘을 더하는 노드는 거의 다 여기 꽂습니다. Turbulence, Disturb, Buoyancy, Wind 자리입니다.

입력 3
Advection

이동 단계입니다. Gas Advect 를 꽂아 지오메트리 포인트까지 함께 흘려보낼 때 씁니다.

입력 4
Sourcing (post-solve)

압력 계산 후에 실행됩니다. 소스를 불어넣거나, 계산이 끝난 값을 다듬는 자리입니다.

FLIP Solver 는 입력 이름이 다릅니다. Fluid to Solve · Particle Velocity · Volume Velocity · Sourcing (post-solve) 네 개입니다. 입자 상태를 손볼 것은 Particle Velocity, 그리드 속도를 손볼 것은 Volume Velocity 에 꽂습니다.

헷갈릴 때 기준은 하나입니다. 압력 계산 전에 손볼 것이냐, 후에 손볼 것이냐. 힘을 주는 것은 전(Velocity update), 결과를 다듬는 것은 후(Sourcing)입니다. 힘을 압력 계산 후에 주면 그 힘이 압력 보정을 거치지 않아 물이 뭉치거나 구멍이 뚫립니다.

거의 모든 노드에 똑같이 있는 파라미터

Gas 노드를 열면 늘 보이는 항목들입니다. 아래 노드 목록에서는 이것들을 빼고 그 노드만의 파라미터에 집중했습니다.

Stencil Field
스칼라 필드 이름을 적습니다. 그 필드 값이 0.5보다 큰 복셀에서만 이 노드가 작동합니다. "여기서만 적용"을 만드는 표준 방법입니다. 비워두면 전체에 적용됩니다.
Use Timestep
켜면 효과가 시간에 비례합니다. 보통 켜둔 채로 둡니다. 끄면 프레임레이트가 달라질 때 결과도 달라집니다.
Time Scale
이 노드에만 적용되는 시간 배율입니다. 1 이 보통, 크면 효과가 빨라지고 작으면 느려집니다.
Parameter Operations
Default Operation
값을 언제 적용할지 정합니다. Set Always 는 매 걸음(키프레임·표현식이 먹힘), Set Initial 은 처음 한 번만. 대부분 기본값 그대로 둡니다.
Data Name
Unique Data Name
시뮬레이션 데이터에 붙일 이름입니다. 거의 건드릴 일이 없습니다. 같은 노드를 여러 개 쓸 때 이름이 겹쳐 덮어써지면 그때 손봅니다.
Group
Solver Per Object
여러 오브젝트를 한 시뮬에서 다룰 때 어디에 적용할지 고릅니다. 오브젝트가 하나면 신경 쓰지 않아도 됩니다.
Use OpenCL
있는 노드에 한해, 켜면 그래픽카드로 계산합니다. 보통 빠릅니다. 결과가 이상하거나 오류가 뜨면 꺼서 확인해 봅니다.

노드 그래프는 이렇게 생겼습니다

Pyro Solver 안이 아니라 바깥에서 연결하는 그림입니다. 솔버 노드에는 입력이 다섯 개 있고, 그중 2~5번이 마이크로 솔버 자리입니다. 1번은 시뮬레이션할 오브젝트를 받습니다.

연기에 소용돌이와 잔결을 더하는 배선
gasturbulence1
큰 소용돌이
gasdisturb1
잔결
↓ 두 노드를 이어서 2번 입력에 꽂습니다
pyrosolver1
1
Object
2
Velocity Update
3
Advection
4
Sourcing

입력 이름은 노드 위에 마우스를 올리면 뜹니다. 순서가 헷갈리면 그렇게 확인하십시오. 참고로 Pre-solve 입력이 목록에 하나 더 있는데, 위 그림에서는 자리를 아껴 생략했습니다.

파라미터 창은 이렇게 채웁니다

Gas Buoyancy 를 예로 들었습니다. 노드를 처음 놓으면 아래 값이 그대로 들어가 있습니다. 즉 손대지 않아도 연기는 위로 뜹니다.

gasbuoyancy1
Velocity Field
vel
힘을 더할 속도장. 파이로는 vel 이 표준입니다
Temperature
temperature
이 필드를 읽어 뜨거운 곳을 찾습니다
Buoyancy Dir
0 1 0
뜨는 방향. 가운데가 Y축이라 위쪽입니다. 옆으로 눕히면 옆으로 흐릅니다
Buoyancy Lift
1
가장 자주 만지는 값. 올리면 빨리 솟습니다
Ambient Temperature
0
기준 온도. 이보다 차가우면 가라앉습니다
Stencil Field
active
거의 모든 Gas 노드에 있는 항목. 이 필드가 0.5 보다 큰 곳에서만 작동합니다

힘은 Buoyancy Lift × (Temperature − Ambient Temperature) 로 계산됩니다. 연기가 안 뜬다면 온도 필드에 값이 실제로 들어 있는지부터 확인하십시오. Lift 를 아무리 올려도 온도가 0 이면 힘은 0 입니다.

이럴 때 이렇게 씁니다

상황별로, 어느 노드를 어디에 꽂고 무엇을 넣는지까지 적었습니다.

연기가 밋밋하고 덩어리로만 올라갈 때

큰 굽이침과 잔결은 서로 다른 노드가 만듭니다. 둘을 겹쳐야 그럴듯해집니다.

  1. Gas TurbulenceVelocity update 입력에 꽂습니다
  2. Swirl Size 를 연기 덩어리 크기의 1/3 정도로 잡습니다
  3. Scale 을 아주 작게 시작해 조금씩 올립니다
  4. 그 오른쪽에 Gas Disturb 를 이어 붙여 잔결을 더합니다

특정 높이 아래 연기만 지우고 싶을 때

Gas Dissipate 는 전체에 똑같이 걸립니다. 위치에 따라 다르게 하려면 직접 씁니다. Gas Field WrangleSourcing (post-solve) 에 꽂고 아래를 넣습니다.

// Fields to Write to : density
float k = fit(@P.y, 0, 2, 0.90, 1.0);
@density *= k;

y가 0일 때 매 걸음 10%씩 사라지고, 2 이상에서는 그대로 남습니다.

불이 지나간 자리를 남기고 싶을 때

온도가 높았던 곳에 흔적 필드를 만듭니다. 먼저 Gas Match Fieldburn 필드를 만들고, Gas Field Wrangle 로 채웁니다.

// Fields to Write to : burn
if (@temperature > 0.6) @burn = 1;
@burn *= 0.98;

Gas Match Field 의 Reference Field 에 temperature 를 넣으면 규격이 자동으로 맞춰집니다.

시뮬이 자꾸 터질 때

속도가 무한대로 튀면 그 뒤 계산이 전부 망가집니다. 순서대로 시도하십시오.

  1. Gas Limit — Destination Field 에 vel, Maximum Choice 를 Constant 로, 값은 씬에서 나올 법한 최대 속도의 2배쯤
  2. Gas Damp — Scale 0.02 정도로 살짝 눌러줍니다
  3. 그래도 터지면 서브스텝을 올립니다. 가장 확실하지만 가장 느립니다

속도를 눈으로 보고 싶을 때

vel 은 방향이 있는 값이라 뷰포트에서 바로 안 보입니다. 크기만 뽑아냅니다.

  1. Gas Match Fieldspeed 스칼라 필드를 만듭니다 (Rank: Scalar)
  2. Gas Analysis 를 놓고 Source Field vel, Dest Field speed
  3. Analysis 를 Length 로 고릅니다

연기에 텍스처를 입히고 싶을 때

rest 좌표가 없으면 텍스처가 공간에 고정돼 연기만 통과해 흘러갑니다.

  1. Gas Match Fieldrest 벡터 필드 생성 (Rank: Vector)
  2. Gas Rest 의 Dest Field 에 rest 를 넣습니다
  3. Gas Advect 의 Field 목록에 rest반드시 추가합니다. 빠뜨리면 안 따라 흐릅니다

처음 열어보는 법

마이크로 솔버는 대부분 이미 큰 솔버 안에 들어 있습니다. 새로 만들기 전에 안을 먼저 보십시오.

  1. 1
    DOP 네트워크에서 Pyro SolverFLIP Solver 를 우클릭합니다.
  2. 2
    Allow Editing of Contents 를 누릅니다. 잠금이 풀립니다.
  3. 3
    더블클릭해서 들어가면, 위에서 본 다섯 걸음이 노드로 줄줄이 이어져 있습니다.
  4. 4
    새 노드는 Tab 키를 눌러 이름을 그대로 입력하면 나옵니다. 예: Gas Turbulence
  5. 5
    원하는 입력에 꽂습니다. 순서가 곧 계산 순서라, 어디에 넣느냐가 결과를 바꿉니다.

필드 이름이 기억나지 않으면, 시뮬레이션을 한 프레임 돌린 뒤 Geometry Spreadsheet 를 열어보십시오. 그 시뮬에 실제로 존재하는 필드 이름이 전부 나옵니다. 파이로 기본은 density temperature vel fuel burn 입니다.