효과를 레이어하는 방법을 조금씩 연습해야한다.
볼륨만으로 다 해결되는 것 아니고, 파티클로 다 해결되는 것도 아니다.
앞으로 후디니를 작업하면 할수록 효과를 레이어해주는 양도 많아지게 된다.
이론!!
일단 기본적인 닫힌 폴리곤에 대해 smoke가 생성되는 세팅을 만들어준다.
gas dissipate의 diffusion은 블러와 관련이 되어있다. 굳이 이용하지 않는 이유는 blur를 적용해야 할 경우, gas blur라는 노드가 있기 때문에 굳이 dissipate 노드에서 블러를 조절할 필요가 없다.
충돌 / 중력
충돌의 조건은 앞으로 볼륨이 된다.
static object에 들어갈 새로운 source를 하나 제작해준다.
dop network 안에서 staticl object 세팅을 추가해준다.
이번에는 움직이는 물체를 static object로 설정해보자.
(파티클 할 때 다 한 내용이다.
static object에서 Use Deforming Geometry를 활성화하는 것을 잊지 말자.
지면과 중력을 추가해보자.
ground plane과 gravity force를 추가한다.
다른 방식의 source setting
우리가 지금까지 smoke solver에서 이용했던 정보는 대부분 fog 정보였다.(vdb from polygon으로 fog VDB를 만들어줌)
이 정보를 바탕으로 name을 활용해서 temperature도 만들고 vel도 만들고 했었다.
처음으로 SDF를 만들어서 static object에 활용해본 케이스가 위의 예시였다.(static object의 proxy volume으로 SDF vdb 사용)
위의 내용은 static object 없이 volume source만으로도 표현이 가능하다.
이것을 가능하게 하기 위해서는 static object를 사용했을 때 volume에 어떤 변화가 생겼었는지 볼 필요가 있다.
velocity field가 움직이는 이유는 막연하게 '물체가 있기 때문에 볼륨이 충돌한다.' 이런 뉘앙스가 아니다.
볼륨이 움직이는 이유는 Advect, velocity field 때문인데 static object가 움직이면서 velocity field를 제공하고 있어서 smoke가 움직이는 것이다.
빨간색으로 묘사된 부분은 static object가 움직이면서 발생시킨 velocity field 부분이다.
아래로 내려오고 있는 부분은 gravity에 의한 부분으로 예상된다.
위로 솟구치는 부분은, static object가 만들어낸 velocity가 smoke solver에 영향을 주고 있다는 것을 뜻한다. 어떤 소스로써 이용이 되었다는 것을 떠올릴 수 있어야 한다.
smoke가 이렇게 움직인 이유는 velocity field가 있기 때문일 것이다. 이것을 static object가 해주고 있던 것이다.
이 내용을 static object 없이 볼륨 소스만을 가지고 해볼 예정이다.
볼륨 소스로 이와 같은 조건을 만들어줬을 때의 이점이 있다.
static object를 사용했을 때는 SDF를 제공해줬고, 자동적으로 velocity field가 만들어졌다.
volume source를 활용하기 위해서는 SDF와 velocity field를 직접 제공해줘야한다.
trail 노드를 활용해서 result type을 compute velocity로 설정한 뒤, 속도를 계산한다.
이렇게 만들어진 v라는 정보를 vdb from polygon에서 활용한다.
surface attribute : 위에서 들어오는 정보들 중에 어떠한 정보를 volume으로 만들어주는 항목
point.v를 선택했고, 우리가 선택한 v에 대한 정보가 vdb로 변환된 것을 확인할 수 있다. 물론 이렇게 생성된 vdb의 이름은 바꿔줄 수 있다.
volume source를 만들어주고, initialize를 collision으로 설정해준다. 각각의 source volume 이름은 밖에서 만들어줬던 col, colvel로 변경해준다.
vdb from polygon에서 torus 내부의 불필요한 정보가 있는것을 방지하기 위해 fill interior를 활성화해주면 torus 내부가 채워진 형태로 결과가 출력된다.
위와 같이 세팅했을 때의 이점.
직접 정보를 만들어서 제공하는 것이기 때문에 velocity에 변형을 가해줄 수 있다.
volume VOP을 달아주고, velocity에 parameter로 값을 곱해줄 수 있도록 세팅한 뒤, 0을 곱해줘서 velocity가 작동하지 않도록 한 뒤의 결과이다.
슥~ 지나가는 무언가가 있긴 한데, 속도가 0이기에 아무런 영향을 주지 못하고 있다.
물체가 볼륨을 지나갈 때 영향을 덜 미치는 것처럼 묘사가 가능하다.
collision으로써 volume source로 충돌을 표현할 때는 velocity에 변화를 주고, smoke가 그에 따라 움직이게 하는 것이 꽤나 간단하게 적용이 가능하다.(velocity 에 값을 곱해주기만 하면 velocity의 세기를 조절이 가능하다) 또한 torus가 충돌 조건이 되는것도 쉽게 이해가 간다.
하지만, 동일 작업을 static object로 표현하는데에는 한계가 있다.
정리.
volume의 충돌조건
- 1. 파티클 때 배웠던 내용과 동일하다. static object를 활용하는 방법이다.
- 2. volume source에서 initialize를 collision으로 설정하는 방법이다.
volume source initialize에 따른 operations 뉘앙스 확인
volume source > Source smoke operations
각각의 target field를 이전 정보에서 새로 들어오는 source에 대해 더해주는 방식(operation > add)이다. scale은 모두 1로 새로 들어오는 source를 주어진 대로 다 더한다는 의미이다.
volume source > Collision operations
일단 collisionvel field는 주어지는 velocity를 1.5배 더 크게 더해서 사용한다는 것이 보인다. SDF로 들어오는 collision field에 scale -1이 곱해지는 것은 SDF의 부호를 뒤집는 것을 의미한다.(SDF는 안쪽이 음수, 밖이 양수 이지만, -1을 곱함으로써 안쪽이 양수, 밖이 음수가 된다.) Scale이 1이라면, SDF가 아닌 fog 정보(밀도값)가 사용될 수도 있다.
volume source > Sink operations
density field에 대해 작업을 한다. sink 정보가 들어온다면 density에서 빼주게 된다. sink 정보가 density에 닿으면 density가 사라지는 것이다.
volume source > Pump operations
속도에 대해서는 vel field에 들어오는 v라는 소스가 더해지는 것을 알 수 있다. pump field에 대해서는 밖에서 pump라는 source가 들어왔을 때 pump field에 이 소스를 복제한다. pump field의 내용을 주어진 소스로 대체한다는 느낌이다. (색 관련 volume을 다룰 때 이야기가 나올 예정)
pyro source를 활용해서 소스를 준비해보자.
표면에서 연기가 나오는 것을 표현하는 방법으로 지금까지 작업한 fog vdb로 polygon을 변환해주고 smoke를 만드는 방식은 좀 곤란하다.
이것을 표현하는 방식으로는 두가지가 있는데, 모두 포인트를 활용하는 방식이다.
1) VDB from Particles
2) Pyro Source - Volume Rasterize Attribute
VDB from Particles 활용방식
일단 VDB from Polygons로 한가지 실험을 하자.
sphere에 점을 뿌리고, 다른 sphere를 만든 뒤 copy to points로 각 점에 복사해줬고, 그 결과를 vdb from polygons로 vdb로 만들어줬다.
점을 바로 볼륨으로 만드는 것이 아니고, sphere를 활용해서 면으로 치환하고 vdb로 바꾸는 과정이 중간에 있는 것이다.
위의 과정이 VDB from Particles의 과정이다. 위의 세팅에서 문제가 발생할 수 있는 부분은 vdb from particles에서도 조심해야하는 부분이다.
point에 대한 밀도를 구하기 위해 두가지 변수를 잘 다뤄야한다.
1) point가 sphere로 대변될 사이즈 : point size
2) voxel size
point size가 voxel size보다 작을 경우, SDF의 포인트가 fog로 변환되면서 살아남지 못하는 경우가 발생한다.
SDF가 Fog로 변환되는 과정은 SDF에 -1을 곱해줘서 양수가 되는 부분에 대해 밀도에 유의미한 값을 가지게 되는데, point size가 voxel size보다 작을 경우, 포인트는 존재하지만, 포인트가 존재하는 voxel의 SDF는 양수를 가지게 되면서 fog로 변환했을 때 음수가 되어서 날아가버릴 위험이 있다.
sphere의 표면을 밀도로 만들어보자.
SDF로 표면이 어디있는지를 구하는 것이 아니고, '표면'을 '밀도'로 만드는 것이다.
표면에 빼곡하게 점을 뿌리고 sphere로 치환한 뒤에 vdb from polygons를 활용해서 fog vdb로 변환했다.
중간 중간 빈 곳이 아쉽다.
이 부분을 채우기 위한 방법 중 하나로는, scatter에서 뿌려주는 점의 수량을 더 늘려주는 방법이 있을 것이다. 혹은 각각의 sphere로 치환되는 point의 size를 키워주는 방법도 있을 것이다. 그것도 아니라면, vdb from polygons의 해상도를 떨어뜨리는 방법도 있다.
1) scatter 점의 수량 증가
약간의 아쉬운 부분이 아직 보이지만, sphere의 표면에 해당하는 밀도를 구할 수 있다.
scatter가 5000일 때 속이 꽉 찬것처럼 보이는 이유는, 5000의 경우 각 포인트에 copy되는 sphere에 의해서 구멍이 없이 완전 막힌 커다른 sphere와도 같이 된다. 이처럼 모든 구간이 막힌 경우에는 안쪽에 대해서 모두 안이라고 표현이 되어서(음수가 되어서) 그냥 밀도처럼 표현이 되어버리는 것이다.
2) point size 변경
point size를 키워주면 좀 더 적은 점의 수량으로 표면의 밀도를 구할 수 있을 것이다. 하지만, point size가 커진다는 것은 위 이미지와 같이 두께가 두꺼워진다는 것을 의미한다.
표면의 두께가 많이 얇아진 것을 확인할 수 있다.
정리
현재 우리는 표면을 밀도로 만들고 싶은 것이다.
그래서 표면에 포인트를 뿌리는 방법을 택할 것이다.
포인트를 기준으로 밀도를 만들어낼 것이다.
우리가 주의해서 잘 조절해야하는 정보로는 scatter에서 뿌리게 되는 점의 개수, point size, voxel size이다.
이제 VDB from Particles를 보자.
parameter는 vdb from polygons와 비슷하다.
scatter를 뿌려주고 vdb from particles를 연결했는데, 결과로 받게 되는 fog VDB가 scatter로 뿌려놓은 sphere보다 상당히 크다.
그 이유로는 Point Radius Scale 때문에 그렇다.
Point Radius Scale : VDB from Polygons 예시에서 적용했던 Point size와 같은 개념이다. 포인트에 뿌려줄 sphere의 사이즈를 의미한다.
위의 이미지를 해석한다면, scatter로 뿌려진 각각의 점에 0.2 크기의 sphere가 대입이 되었고, 그 내용을 fog VDB로 만들어준 것이다.
Point Radius Scale을 줄이다 보면 결과가 출력되지 않는 순간이 발생한다.
출력이 발생하지 않는 순간에 대한 공식이 있다.
Point Radius Scale = Minimum Radius in Voxels * Voxel Size
이 말은 곧, Point Radius Scale이 Minimum Radius in Voxels * Voxel Size 의 결과보다는 무조건 커야 결과가 출력이 된다는 것이다.
(예외가 있기는 하다. voxel size가 매우 작을 경우, Point Radius Scale이 위의 두 값의 곱과 같아도 결과가 출력될 수 있다.)
Point Radius Scale을 식으로 적어놓으면 좋은 점이 있다.
Point Radius Scale = (Minimum Radius in Voxels * Voxel Size) + 0.000001
이렇게 되면 표면의 두께를 Minimum Radius in Voxels로 조절해줄 수 있게 된다.
이와같이 상관관계를 모를 경우, 작업을 진행하다가 스트레스를 받게 된다. 표면을 얇게 해서 볼륨을 사용하고 싶은데 두께를 조절할 줄 모르고 이 값 저 값을 조절하다가 결과가 원하는대로 출력되지 않는 경우가 발생할 수 있기 때문이다.
위의 경우처럼 세팅을 진행할 경우, 필요에 따라 얇은 표면의 볼륨부터 두꺼운 표면의 볼륨까지도 쉽게 다뤄낼 수 있다.
이제 위의 세팅을 토대로 sphere 표면에서 연기가 나도록 만들어보자.
기존의 smoke 세팅과 큰 차이는 없지만 한가지 추가된 점은 sphere를 collision 소스로도 활용했다는 점이다.
collision에 대한 volume source가 없었다면, sphere의 안쪽으로 연기가 뚫고 올라왔을 것이다.
속이 빈 것이 느껴지고, 속이 찬 상태의 불모양과는 또 다른 느낌이 있다.
움직이는 박스에서 불이 나도록 해보자.
일단 박스를 만들고, 속도를 구해줄 point 수량을 늘리기 위해 remesh 노드를 적용한다.
그리고 transform으로 적당한 움직임을 만들어주고, trail의 compute velocity를 활용해서 각 포인트에서의 속도를 계산한다.
그리고 vdb from polygons의 surface attriubtes에서 v에 대해 colvel vdb를 만들어준다.
volume source 안에서 colvel에 대해서 collisionvel field에 넣어준다.
이거는 숙제!
숙제 1차 업데이트!!!
많이 아쉽다. 몽글몽글 연기보다는 그냥 한번 휘리릭 하고 사라지는 느낌도 아쉽고, 색도 아쉽고... 죄다 아쉽다.
첫술에 배부를 수는 없지만... 일단은 아쉬움을 뒤로 하고 1차는 이렇게 업데이트!!!
2차를 도전하러... 가기 전에 일단 현생을 살기 위해 잠을 자러...(현재 시간 오전 4시...아하하)
출근하기 싫다...
숙제하러 가야지...
흥미진진하다!!!
쉽다 쉽다 오늘도 쉽다 (라고 자기 세뇌중...)
'Houdini > Houdini1_Volumes' 카테고리의 다른 글
11_part1. 전기 만들기 (0) | 2023.03.07 |
---|---|
10_POINT DEFORM, BRUTE 캐릭터 표면 연기 만들기 (0) | 2023.03.03 |
08_연기 모양에 영향을 미치는 것들, POP ADVECT BY VOLUME 적용 (0) | 2023.03.01 |
07_SMOKE SOLVER 기본기 (0) | 2023.02.27 |
06_SOLVER와 함께 VOLUME 다루기 (1) | 2023.02.25 |