스파크 소스부터 체크해보자.
전기의 시작점과 끝점이 중요하다.
스파크를 만드는 아이디어(바람에 대한 부분은 추후에 생각하기로 하자)
- 기본적으로 시작점과 끝점에서 스파크가 발생했으면 좋겠다.
- 기본적으로 지면에서의 시작점은 지면의 노멀방향을 가지고, 몸에 붙는 끝점은 그 위치에서의 면의 노멀방향을 가지면 된다.
- 이 때 가지게 되는 노멀 방향이 이니셜한 방향이 된다.
- 모두 노멀방향으로 스파크가 생성되면 일관된 방향으로 튀게 되므로, 어느정도 랜덤한 값이 추가된다.
file cache로 불러온 데이터에 대해 불필요한 정보들을 날려줘야한다.
생각보다 많은 정보가 쌓여있다. 선을 제작하는 과정에서 dynamic solver를 사용했기 때문이다. 심지어는 N(노멀)에 대한 정보도 가지고 있다. 하지만 우리가 사용하기에는 값이 너무 작다. 전기를 만드는 과정중에서 어떠한 계산에 의해 N의 값을 줄여줬기 때문이다.
이 값을 사용한다면, 우리가 원하는 속도감을 얻기 어려울지도 모르기 때문에 N을 다시 구해줄 필요가 있다.
이전에 작업했던 파티클의 결과로서 얻은 부산물들을 깨끗하게 날려주기 위해서 clean 노드를 사용한다.
이제 시작점과 끝점을 얻어올 필요가 있다.
얻어온 시작점/끝점에 대해 지면/브루트에서 노멀정보를 가져올 것이다.
하나로 연결되어있는 선들에 대해서 각각 작업을 진행한다.
for-each connectied piece를 연결해주고 block end 노드의 single pass를 활성화해주면 연결되어있는 라인만 확인할 수 있다.
이제 시작점과 끝점을 blast 노드를 사용해서 떼어내자.
시작점은 0으로 떼어내기 쉽다. 끝점의 경우는 blast를 사용해서 직접 끝점의 포인트 넘버를 입력해줄 수 도 있지만, 포인트의 개수가 달라지면 이 방법은 사용하기 어렵다.
그래서 끝점을 얻어오기 위해서 sort 노드를 사용해서 point sort를 reverse로 설정해준다. 이렇게 되면 끝점의 번호가 0으로 바뀌게 되고, 여기에 blast 노드를 사용해서 0번 포인트를 떼어주면 끝점을 얻을 수 있다.
이제 얻어온 정보에 노멀정보를 만들어주자.
일단 Grid를 만들고, brute 캐릭터와 함께 normal 노드를 사용해서 노멀 정보를 만들어준다.
그리고 이 둘을 merge로 묶어준다.
위의 이미지의 노드들이 가지는 노멀정보가 우리의 시작점/끝점의 레퍼런스가 될 것이다.
attribute transfer 노드를 사용해서 노멀정보를 시작점/끝점으로 옮겨준다.
동일한 내용을 small file cache에도 적용해준다.
이제 파티클을 만들어야한다.
규칙을 정할 필요가 있다.
- 큰 전기에서 만들어지는 파티클은 입자도 좀 더 크고 폭발적으로 파티클이 튀었으면 싶다.
- 작은 전기에서 만들어지는 파티클은 입자가 상대적으로 좀 더 작고, 생성되는 세기도 좀 덜 세도 될 듯 싶다.
큰 전기에 대한 부분부터 작업을 진행한다.
노멀 정보를 바탕으로 initial velocity를 만들어준다.
Dop Network 를 만들고 파티클 세팅을 잡아준다.
현재는 이쁘게 보이는 그런 것은 없지만, 적어도 날아가는 방향이 올바른 방향이라는 것은 알 수 있다.
pop force 노드를 이용해서 중력을 표현해주고, ground plane을 생성해서 적용해준다.
파티클이 살아있는 시간은 pop source의 birth 탭에서 life expectancy / life variance 를 조절해준다.
우리가 원하는 느낌은 아니지만(너무 정직하다) 기본적인 세팅은 다 되었다.
이제 tweak이다.
pop source의 attribute tap으로 가서, initial velocity를 이용하되 임의의 값을 추가해주도록 add to inherited velocity로 설정해준다.
initial velocity에 임의의 랜덤한 값을 추가해주는 것은 attribute tap에서 조절해주면 되고, 생성되는 파티클의 수량은 birth 탭의 const. birth rate를 조절해주면 된다.
이제 생성된 파티클이 몸통과 충돌할 수 있도록 세팅을 만들어줘야한다.
brute의 SDF가 필요하다.
dop network 안의 세팅을 수정해준다.
생성된 파티클에 trail을 연결하고 add 노드를 이용해서 선으로 만들어준다.
이제 연기와 같이 보면서 타이밍을 맞출 필요가 있다.
파티클이 오래 살아남는 것이 아쉬울 때는 Pop source에서 const. birth rate에 key animation을 줘서 일정 시간 이후부터는 파티클이 생성되지 않도록 해줄 수 있다.
이제 작은 전기에 대한 스파크를 만들어주면 된다.
큰 전기에서 생성된 스파크는 무게감이 있다는 가정 하에 스모크의 velocity의 영향을 따로 안받도록 묘사했다.
작은 전기의 스파크는 사이즈가 더 작아서 팔을 휘두르면서 발생되는 바람에 딸려 움직이는 것처럼 묘사할 예정이다.
초기속도는 큰 전기에서 작업한 것과 같이 @N 값을 초기속도로 설정한다. 대신에 너무 크게 적용될 수 있기 때문에 @N에 channel float 값을 곱해줌으로써 조절할 수 있도록 해준다.
충돌조건 / 바닥에 대한 충돌은 큰 전기 스파크와 동일하게 적용되므로 이전 dop network에서 복사해서 가져온다.
Pop force 노드로 중력을 적용시키고, 생성되는 파티클의 수량과 수명을 조절해준다.
pop source를 복사해서 const. birth rate을 상당히 많이 올려주는 버젼을 하나 더 만들어준다.
파티클 수량이 많으면 나중에 확률을 적용해서 생성되는 파티클의 양의 조절해줄 수 있다. 하지만 처음부터 파티클의 수량이 적으면 나중에 조절이 어려워진다. 그렇기 때문에 지난번에도 수업시간에 이야기가 나왔었지만, 파티클은 가급적 많이 만드는 것이 좋다.
일단 @id를 활용한 rand function으로 float seed를 만들어준다. 이것이 가능한 이유는 파티클들이 모두 고유한 id를 가지기 때문이다.
그리고 조건문을 적어서 필요없는 파티클을 날려준다.
channel float을 활용해서 생성되는 파티클의 비율을 조절해줄 수 있다. (0~1)
그리고 같은 비율을 날리더라도 조금이라도 다른 파티클들을 날리고 싶을수도 있기 때문에, seed 값을 변경할 수 있는 channel float을 하나 더 만들어서 rand function 안의 @id에 더해준다.
이제 바람에 대해서 묘사를 해보자.
이 때 필요한 정보는 smoke를 만들면서 사용되었던 vel 정보이다.
blast를 활용해서 density와 temperature를 빼주고 남은 정보는 vel이다.
일반 볼륨인 vel.x / vel.y / vel.z 를 convert VDB 노드로 VDB 정보로 변환해준 뒤, VDB Vector Merge 노드를 사용해서 3개의 float VDB가 아닌 1개의 vector VDB로 만들어준다.
이렇게 만들어진 vel 정보를 파트킬 시스템 안에서 사용하고싶은 것이다.
Pop Advect by volume 노드를 활용한다.
Advection Type은 Update Position으로 설정해준다.
guide를 켜주면 Advect에 관여하는 정보를 확인할 수 있다.
위로 솟구치는 파티클들이 존재한다. 그 이유로는, smoke solver 때문이다. 시간이 지남에 따라 온도에 의해서 위로 올라가는 연기가 있기 때문에 그 연기의 흐름에 의한 속도로 인해 파티클들이 위로 솟구치는 것이다.
이 부분에 대한 조절은 Pop Advect by Volume의 Parameter 탭에서 Velocity Scale에 key animation을 적용해줌으로 조절해줄 수 있다.
랜더를 위해서 오늘 작업한 파티클들을 cache로 뽑아낸다.
선으로 바꾸고 그러는 작업들은 나중에 면으로 치환하거나 해줘야하기 때문에 굳이 지금 저장할 필요는 없다.
그렇기 때문에 cache 데이터는 포인트 단위에서 저장해주는 것으로 하자.
모든 데이터가 준비되었기 때문에 다음 시간에는 렌더를 진행해볼 계획이다.
그 전에...
이제는 정말 치열하게 부딪혀볼 시간이다.
선생님이 보여주신 과정들과 tweak들은 본인 스스로가 직접 해봐야 내 것이 된다.
숙제.
brute의 머티리얼 세팅을 진행해둘 것!
효과를 만들어나가는 재미가 붙을 때가 왔다.
하나의 solver로 다 해결되는 것이 아니다.
이제는 어설프게 알아서는 따라갈 수 있는 내용이 아니다.
알만한 부분은 슉슉 넘어간다.
이제부터의 수업이 이해가 안가는 부분이 있다면, 반드시 반드시 복습 철저하고 꼼꼼하게 하고 흐름 챙겨서 수업을 듣자.
언제나 즐거우면서도, 항상 부족한 시간...ㅠ
고민이 깊어지는 밤이다.
'나는 왜 후디니를 공부하는가...?'
'Houdini > Houdini1_Volumes' 카테고리의 다른 글
13_VOLUME RENDER_part2. Brute 최종 랜더 (전기, 스파크 면만들기, Pass 따로 뽑기) (1) | 2023.03.11 |
---|---|
13_VOLUME RENDER_part1. 최소한 Volume Visualization과 똑같이 뽑아야함(🔥🔥미친듯 중요🔥🔥) (1) | 2023.03.10 |
11_part2. 캐릭터 움직임에 따른 전기 효과 (0) | 2023.03.08 |
11_part1. 전기 만들기 (0) | 2023.03.07 |
10_POINT DEFORM, BRUTE 캐릭터 표면 연기 만들기 (0) | 2023.03.03 |