볼륨: 연기, 불, 액체
볼륨은 표면이 아니라 복셀 상자입니다. 연기 기둥, 불꽃, 폭발, 물. Pixor는 Blender, EmberGen, Houdini의 .vdb 파일을 읽고, 시뮬레이션 도구가 없을 때를 위해 자체 볼륨도 몇 가지 갖추고 있습니다.
볼륨에는 지오메트리가 없습니다. 픽셀마다 광선을 볼륨 속으로 진행시켜 프로세서에서 그리며, 그 결과는 모델과 같은 그림에 들어갑니다. 그래서 불꽃이 손 앞에 놓이고, 캐릭터가 연기 속에 서며, 띠, 선, 정리가 볼륨을 다른 모든 것과 똑같이 다룹니다.
추가하기
장면 단계에서 아웃라이너의 + 메뉴, 볼륨 아래:
| 퍼프 | 둥근 연기 한 줌 |
| 불꽃 | 아래는 뜨겁고 좁게, 위는 차갑고 넓게 |
| 구름 | 넓고, 아래는 평평하고, 위는 울퉁불퉁하게 |
| 안개 | 가늘고, 낮고, 고르게 |
| .vdb 파일에서… | Blender, EmberGen, Houdini의 시뮬레이션 |
볼륨은 장면 그래프의 볼륨 노드이며, 아웃라이너의 행도 같은 노드입니다. 그 뒤의 행 노드는 볼륨을 한 줄로 늘어놓아 사본마다 하나씩 배치하고, 아무 데도 연결되지 않은 볼륨은 장면에 없습니다. 설정도 노드에 있습니다(볼륨 이름으로 pxr project scene game.pixor --set flame.voxels=48).
명령줄에서는 --volume flame:0.5,0.8,0.5:0,0.55,0이며, 숫자는 크기와 위치를 미터 단위로 나타냅니다. 같은 자리에 .vdb 경로를 써도 됩니다: --volume smoke.vdb:1.2.
본에 실린 볼륨은 모든 클립에서 본을 따라가며(손에 든 횃불의 불꽃) 불처럼 똑바로 선 채로 있습니다. 이때 위치는 본 기준으로 잽니다. 명령줄에서는 끝에 @BONE: --volume flame:0.25:0,0.05,0@hand.r.
이펙트의 방출기에 실린 볼륨은 그 이펙트의 일부입니다. 방출기가 어디에 있든(본 위에, 또는 클립의 키가 움직이는 곳에) 이펙트 자체의 행에만, 이펙트의 첫 프레임부터 그려집니다. 폭발의 연기, 주문의 불꽃 같은 것입니다. 이때 위치는 방출기 기준으로 잽니다. 명령줄에서는 프로젝트의 N번째 이펙트에 @effect:N: --effect explosion --volume puff:1.5@effect:1.
그리는 방식
이것들은 볼륨 인스펙터의 그리는 방식 아래에 있습니다.
- 두께는 픽셀을 그리기 위해 필요한 볼륨의 양입니다. 높이면 더 촘촘하고 단단한 형태, 낮추면 더 가냘픈 형태가 됩니다.
- 부드러운 가장자리는 해진 가장자리의 폭입니다. 가장자리는 볼륨 자체에 고정된 규칙 패턴으로 디더링되어 사라지며 섞이지 않습니다. 그래서 모든 픽셀이 팔레트를 벗어나지 않고, 볼륨이 돌아도 패턴이 기어 다니지 않습니다.
- 자체 그림자는 빛이 볼륨을 통과해야 하는 곳을 볼륨이 얼마나 어둡게 하는지입니다.
- 색은 볼륨 자체의 색이며, 램프는 이 색으로 만듭니다. 뜨거운 색은 타는 부분의 색입니다. 색과 같게 두면 아무것도 타지 않으므로 연기에 알맞습니다. 글로 대상은 빛과 상관없이 뜨거운 색을 받으려면 얼마나 뜨거워야 하는지 정합니다.
- 복셀은 볼륨을 가장 긴 변을 따라 얼마나 잘게 나눌지입니다. 스프라이트 픽셀 하나에는 복셀 한두 개가 알맞습니다. 그보다 많으면 매 프레임 다른 복셀이 픽셀을 차지해 반짝거리기만 합니다. 256³ 시뮬레이션도 불러올 때 이 수준으로 줄이므로 32 px의 연기 기둥이 흔들리지 않습니다.
- 샘플은 복셀마다 광선 위의 점을 몇 개 볼지입니다. 스프라이트 크기에서는 2면 충분하고, 많을수록 부드럽지만 느립니다.
볼륨에는 반짝임이 없습니다. 구름에는 반짝임이 없고, 볼륨의 음영 기준인 밀도는 반짝임을 허용하면 번쩍일 만큼 울퉁불퉁하기 때문입니다.
시퀀스: 움직이게 만들기
.vdb 하나는 정지된 볼륨 하나입니다. 시뮬레이션은 프레임마다 파일 하나를 씁니다: fire_0001.vdb, fire_0002.vdb 등. Pixor에 그중 첫 파일을 지정하면 나머지를 재생합니다.
볼륨의 시퀀스 섹션에서:
| 프레임 | 연 파일부터 세어 재생할 파일 수 |
| 모든 | N개 중 파일 하나만 사용: 시뮬레이션은 대개 스프라이트에 필요한 것보다 많은 프레임으로 기록됩니다 |
| 반복 닫기 구간 | 끝에서 이만큼의 프레임을 처음으로 크로스페이드해서, 스프라이트가 끊김 없이 계속 돌게 합니다. 그 파일들은 페이드가 되고 재생되지 않습니다. 파일 다섯 개에 페이드 하나면 네 프레임입니다 |
명령줄에서는 크기와 위치 뒤에 시퀀스가 옵니다: --volume fire_0001.vdb:1.5::24,2,4 — 파일 24개를 하나 걸러 쓰고, 마지막 네 개는 첫 파일로 서서히 돌아갑니다.
시퀀스는 시트에 이미 있는 움직임과 함께 재생됩니다. 걷기 사이클 옆에 불을 두면 불의 프레임이 걷기의 프레임이 됩니다. 다른 움직임이 없으면 시퀀스 자체가 움직임이 되어 volume이라는 자체 액션을 받습니다.
모든 프레임은 시퀀스 전체가 채우는 상자에서 얻은 같은 변환으로 배치되므로, 커지는 연기 기둥 때문에 그림이 매 프레임 다시 줄어들지 않습니다. 이는 크기가 첫 프레임이 아니라 시퀀스 전체의 크기라는 뜻이기도 합니다.
시퀀스는 통째로 메모리에 올라가지 않습니다. 각 파일을 한 번 읽어 그 상자를 찾고, 시트나 미리보기가 그 프레임에 닿을 때 다시 읽으며, 마지막 세 개만 보관합니다. 긴 시뮬레이션은 메모리가 아니라 읽는 시간이 듭니다.
Pixor가 읽는 것
일반적인 트리 구조에 float 또는 벡터 그리드를 담은 .vdb 파일. 값은 그대로, zip 압축, 또는 Blosc-LZ4 압축(Blosc 1.14 이후 버전처럼 바이트별 스트림 분할 여부와 상관없이)으로 저장되고, 전체 값 또는 활성 값만 담겨도 됩니다. Blender, EmberGen, Houdini, OpenVDB 자체 도구가 쓰는 형식입니다. 픽셀화에는 density, smoke, fog 또는 d라는 그리드를, 뜨거운 부분에는 temperature, flame, heat 또는 fire를, 깜빡임 방지 단계가 쓰는 움직임에는 velocity를 씁니다. 액체 표면(레벨 셋)은 가장자리가 단단하고 속이 꽉 찬 두께로 읽습니다.
Pixor가 읽을 수 없는 것은 잘못된 결과를 내는 대신 이름을 들어 알려 줍니다. 다른 압축 방식, 다른 종류의 트리, 기울어진 트랜스폼 같은 것이죠. pxr inspect fire.vdb는 파일의 그리드와 그 크기, 복셀 크기를 출력합니다.
아직 없는 것
- 액체는 볼륨으로 읽고 그리며, 거품도 반사도 없습니다. 둘 다 있는 수면은 월드의 Water 노드입니다(월드).