
후디니로 표현하는 대표적인 전기 두가지
- 굵직한 가닥에 자잘한 가닥들이 달려있는 번개같은 느낌
- 표면을 타고 흐르는 전기같은 느낌
- 때에 따라서는 표면을 타고 흐르는 전기 또한 잔가지가 많아질 수 있다.

전기같은 이펙트는 어려운 묘사는 아니다. 다만, 규칙을 초반에 잘 정해야한다. 그래야지 논리적으로 빌드업을 진행해서 만들어나갈 수 있다. 우연히 표현된 것은 의도를 가지고 구현을 하려고 할 때 원하는 느낌이 안날 수 있다. 기왕이면 꼭 의도를 가지고 만들자.
매우 중요한 이야기
- 전기 효과를 만들때는 반드시 시작점과 끝점을 잘 설정하라.
- 처음에는 하나의 시작점과 하나의 끝점을 가지도록 작업하는 것이 중요하다.
전기작업의 큰 순서
- 시작점과 끝점 정의내리고 두 점의 id 일치시키기
- 노이즈 패턴 정의내리기
- 디테일 살리기
점을 두개 생성한다. 그리고 두 점을 선으로 이어준다.


start와 end에 점이 두개씩 있다면 add의 결과가 어떻게 될까?


우리가 원한 결과는 이런 N 모양이 아니고, 위의 두 점이 이어지고 아래 두 점이 이어져서 평행선이 그어지는 것이었다.
attribute wrangle을 활용해서 각 point에 id를 부여한다. 그리고 마지막 add 노드에서 attribute name이 같은 point를 이어주도록 by attribute로 설정한다.



resample 노드로 시작점과 끝점 사이에 무수히 많은 점들을 만들어주고, attribute VOP을 활용해서 노이즈를 추가한다.


시간이 흐름에 따라 노이즈가 움직일 수 있도록 P 정보와 Time을 조합해서 aaflownoise의 Pos에 연결한다.
속도에 대해서는 time에 multiply를 달아줘서 조절해준다.

현재는 애초에 제공했던 시작점의 위치 / 끝점의 위치가 노이즈가 적용이 되면서 바뀌어버렸다.

resample 노드에서 curveu를 활용한다.
Curve U Attribute
- 각각의 포인트들이 시작점과 끝점 사이에서 어느정도의 지점에 위치하고 있는지를 0~1 사이의 값으로 표현한 정보.
- 시작점 : 0 / 끝점 : 1
- 임의의 점 a가 시작점과 끝점의 정중앙에 위치하고 있다면, curveu의 값은 0.5 이다.
- 0~100 을 0~1로 표현했다고 생각해도 좋을 듯 하다.
- 임의의 점이 25% 위치에 있다고 한다면, curveu의 값은 0.25이다.
Attribute Rename Node
- attribute의 이름을 변경해줄 수 있다.

fxmult를 attribute VOP의 노이즈의 결과에 곱해보자.


시작점의 fxmult 값이 0이기 때문에 noise가 적용되지 않아서 고정되는 것을 볼 수 있다. 그리고 초반부는 fxmult가 0에서 점점 커지는 것이기 때문에 noise가 적게 적용되다가 끝점에 가서 노이즈가 커지는 것을 볼 수 있다.
이 말은 fxmult를 조절해줄 수 있다면, 적용되는 noise의 양도 조절해줄 수 있다는 것을 의미한다.
Attribute wangle로 chramp를 만들어준 뒤, fxmult를 조절해주자.







정리
- 시작점과 끝점에 대해서 미리 정보를 준비해서 넣어줬다.
- attribute wrangle을 가지고 id를 정리해주는 과정이 있었다.
- 시작점과 끝점의 id가 일치하는 점들이 필요했기 때문이다.
- 포인트의 갯수를 늘려주면서 resample 노드에서 curveu attribute를 만들어줬다.
- curveu는 fxmult라는 이름으로 변경해줬고, 이 값은 chramp를 가지고 조절해줬다.
- fxmult(curveu)는 위치별로 얼만큼이나 효과가 적용될지를 정해주는 값이고, 이 값이 noise에 곱해지면서 사용자가 원하는 위치에 따른 노이즈 값 변화를 줄 수 있었다.

같은 노드를 복사해서 위의 line에도 연결해줬다.
동일한 패턴이 나오지 않는 이유는, Attribute VOP에서 노이즈에 제공되는 P의 값이 다르기 때문이다.

같은 내용의 중복은 for each connectied piece를 활용해서 정리해준다.

왼쪽의 block 처리된 결과와 for each connectied piece의 결과는 같다. 이 말은 위쪽에 더 많은 line이 들어오더라도 동시다발적으로 전기 표현이 가능하다는 것을 의미한다.

여기까지가 제일 기본이 되는 구조이고, 다음 단계는 시작/끝점의 위치가 변하는 케이스이다. 여기에서부터는 noise의 적용은 자동적으로 적용이 된다고 우리의 작업을 신뢰하고 작업을 진행하기로 한다.(최종적으로는 아래쪽도 바뀌긴 하지만, 일단 지금은 잠시 보류하자)
만들어볼 결과물은 두 벽을 세우고, 그 사이를 전기가 통하도록 하는 것이다. 그렇게 통하는 전기는 마치 위로 올라가는 것 처럼 만들 것이다.

일단 각 박스에 마주보는 면에 임의의 점을 5개씩 만들어주자. 그렇게 만들어준 점을 start와 end에 연결하면 바로 전기효과가 적용되는 것을 볼 수 있다.


이것은 박스 사이의 간격이 벌어져도 잘 적용된다.

시작과 끝이 고정되어있어서 약간 부자연스러워보이는 부분이 있다. 이제 시작점과 끝점이 움직이도록(위로 올라가도록) 만들어보자.
point가 움직이도록 하기 위해서 pop solver를 활용해보자.
가운데에 grid를 만들고, 그곳에 scatter로 점을 뿌려준다. global seed 값에 $F를 설정해서 매 프레임마다 다른 위치에 점을 뿌려주도록 해준다.


위에서 작업한 것을 source로 활용해서 dop network를 만들고 기본적인 파티클 시스템을 만들어준다.

파티클의 수량이 너무 많은 관계로 switch를 달아서 특정 프레임에서 source로 사용될 점이 생성되도록 해준다.


속도가 느린 관계로 초기 속도를 정의해준다.

이렇게 만들어준 particle의 결과를 box의 마주보는 면에 붙여보자.
Ray Node
Method를 Minimum Distance로 적용하면 첫번째 들어오는 input을 두번째 들어오는 reference에 가장 가까운 위치에 붙일 수 있다.


시작점으로 연결해주고, 위에서 작업한 내용을 그대로 복사해서 끝점에도 연결해준다. 다만, 한군데 바꿀 곳이 있는데, scatter에서 global seed의 $F 를 $F+1로 변경해서 시작점과 다른 seed를 갖도록 해준다.
전기가 나왔다가 사라지도록 해주기 위해서는 dop network 안에서 birth 세팅을 바꿔주면 된다.
시작점과 끝점이 살아있는 타이밍을 맞춰주는 것이 중요하다.
움직임은 꼭 같도록 안해줘도 상관없다(양쪽 dop network의 pop wind 수치가 꼭 동일할 필요는 없다.)
이번에 주목해볼 부분은, 위에서 box에 포인트를 ray로 붙여준 것 처럼, '어디에' 포인트들을 붙여주는가? 이다.
움직이는 물체에 포인트들을 ray로 붙여볼 예정이다.
일단 움직이는 물체를 만들어보자.


box를 만들고 각목처럼 조절해준 뒤, transform을 활용해서 돌려주고 merge로 묶어줬다. 그리고 마지막 transform에서 이 물체에 움직임을 추가해줬다.
box로 물체를 만드는 과정에 겹치는 면이 발생했는데, 이 부분이 계산에 방해를 줄 수 있으므로, SDF를 만들고 다시 polygon으로 변환시켜서 내부에 겹치는 면이 없도록 해준다.
아쉬운 부분이 보인다. noise 패턴이 일정한것처럼 보이는 부분이 있다.
각각의 선들이 서로 다른 노이즈 패턴을 가지도록 수정해보자.
for 블럭을 들어가기 전에 connectivity를 확인해보면 id attribute를 가지고 있는 것을 알 수 있다. 이 id를 position 정보의 y값에 더해준다. 각각이 가지는 id가 다 다르기 때문에 노이즈의 패턴 또한 다 달라지게 된다.

이렇게 가장 기본이 되는 전기형태를 알아봤다.
지금까지의 전기의 특징
- 시작과 끝점이 서로 다른 물체에 맺혀있다.
- 시작점과 끝점을 따로따로 잘 통제해주는 것이 중요하다.
이제 표면에 흐르는 전기에 대해 이야기해보자.
굵직한 세팅은 비슷하다.
시작점과 끝점을 더욱 능수능란하게 다뤄야한다.

이런 그리드가 있을 때, 이 그리드 위에서 내가 원하는 경로로 전기가 흐를 수 있어야한다.
일단은 간단하게 하나의 전기가 왼쪽에서 오른쪽으로 흐르도록 만들어볼 예정이다.
아이디어는 간단하다. 왼쪽에서 오른쪽으로 움직이는 라인이 있고, 이 라인이 전기처럼 보이면 된다.
전기가 흐를 경로를 만들어주자.

이렇게 만들어준 라인을 따라서 전기가 흐르기를 원하는 것이다.
carve를 연결해주고, firstU / secondU에 대해 attribute wrangle로 애니메이션 되는 값을 만들어서 적용해준다. (attribute wrangle에서 만든 내용은 carve에서 point function을 활용해서 불러온다.)

전기로 사용될 기준이 되는 라인이 완성되었다.
이 결과에 noise를 적용하면 1차는 완성이다.

지금부터는 표면 위를 전기가 다니는 것처럼 묘사할 필요가 있다.

grid를 놓고 옆에서 보면 표면 위를 흐른다기보다는 그냥 시작 / 끝 점 사이에 노이즈가 있는 것 뿐이다. 표면 위로 살짝 올라와있는 그런 느낌적인 부분을 묘사할 필요가 있다.
grid의 row와 column을 높여주고 mountain 노드를 연결해서 굴곡을 만든다.

이제 우리가 위에서 만들었던 line animation을 grid와 mountain에 붙여보자.
이렇게 얻어진 ray의 결과는 다시 resample의 과정을 거치는 것이 필요하다. 그 이유는 ray 노드를 활용해서 mountain에 가장 가깝다 생각되는 위치에 point가 붙으면서 점 사이의 간격이 달라질 수 있기 때문이다.(shape은 상관없다. 다만 점들 사이의 간격이 일정했으면 하기 때문이다.)


지금까지 만들어준 것은 ray 노드로 인해 표면에 딱 달라붙어서 진행되는 line animation이다. 하지만 지금 표현하고 싶은 것은 시작부분과 끝부분만 표면에 붙어있고, 중간은 표면에서 살짝 떠서 진행되는 전기 흐름이다.
line의 point들이 mountain의 표면에서 살짝 떠오르도록 하기 위해서, line의 point들의 @P에 mountain의 @N에 해당하는 값을 더함으로써 떠오르도록 해줄 수 있을 것이다.(처음 / 끝 점은 제외)
일단 mountain이 normal을 갖도록 normal 노드를 연결해준다.
그리고 ray 노드의 parameter를 체크해본다.

아래쪽에 Import Attributes from Hits 가 있는데 이것은 ray로 어떤 물체에 붙었을 때, 붙은 물체에서 attribute를 가지고 올 것인가에 대한 항목이다.



@P에 @N을 더해주는데, @N을 그냥 더하면 값이 크기 때문에 적절하게 조절할 필요가 있다. 그리고, 시작점과 끝점은 영향을 안받도록 하기 위해서 resample 노드에서 curveu attribute를 생성했고, 이 값을 chramp로 조절해서 처음과 끝은 표면에 붙어서 따라가고, 중간은 살짝 떠올라서 갈 수 있도록 만들었다.
noise를 주기에 point가 아직 부족하다. subdivide로 쪼개주고 다시 resample을 적용하자.
그리고 위에서 적용했던 noise를 적용시켜준다.

위의 결과는 mountain의 height 값이 변하거나, offset의 변화로 지면이 움직여도 잘 적용된다.
한가지 아쉬운 부분을 수정해보자.
시작지점과 끝지점에서 전기가 튀는것처럼 보인다. 너무 강하다. line이 짧을 때는 힘을 약하게 받다가 line이 길어지면 강하게 받고, 다시 line이 짧아지면 힘이 약해지도록 해보자.
- 두 점 사이의 distance를 활용한다.

이렇게 만들어준 @dist 값은 @N 값을 더해주던 곳에 곱해주도록 한다.

위의 결과를 grid에 적용해보니 시작점과 끝점이 너무 얌전하게 움직인다. 이 부분에 대해 수정을 해보자.
line animation 자체에서 point들의 위치에 noise를 추가해준다.


이제 직선으로 움직이는 경로를 원형으로 바꿔보자.

전기 한가닥이 아닌, 여러가닥의 전기 다발을 만들어보자.
파티클 시스템을 만들어준다.

생성되는 파티클에 trail 노드를 활용해서 궤적에 해당되는 포인트를 더 얻고, add 노드로 line을 만들어준다.
전기 다발에 각각 위에서 작업한 전기효과가 적용되어야하기 때문에 for each connectied piece를 활용해준다.

위의 내용을 subnet으로 정리해준다.


전기 흐름에 방향을 추가하고 싶다면, subnet 밖의 dop network에서 wind의 방향을 바꿔주면 될 것이다.
이번에는 sphere의 아래쪽에서 위쪽으로 전기가 올라가는 것을 묘사해보자.
sphere를 만들고, 이것을 source로 하는 파티클 시스템을 만든다.
그리고 같은 sphere를 복사하고, 이곳에 ray로 파티클을 붙여준다.

너무 지렁이같다. 전기처럼 보이지 않는 이유는, 지금까지 라인을 만들 때 trail을 활용해서 만들었는데, 이렇게 되면 경로를 너무 따라가는 느낌이 강해서 부자연스럽게 보일 때가 있다.
이것을 해결하기 위해서, dop network를 두개 사용할 예정이다. 두개의 dop network로 서로 다른 움직임을 보이는 점을 만들어주고, sphere에 붙이고 두 점을 연결해주기로 한다.

이번에는 물체를 바꿔보자.
망치에 적용해보자!
현재 두개의 dop network 세팅은 wind를 제외하고는 모두 동일하다.
만약 한쪽의 pop source의 seed 값이 바뀐다면?
전기의 양은 줄어들고, 아까보다 좀 더 깜박깜박 거리는것 같다. 그 이유는 한쪽의 seed가 변경되었기 때문에, 양쪽 particle의 id가 일치하는 시간이 줄어들었기 때문이다. id가 일치할 때만 두개의 점이 이어지면서 전기로 표현이 되는데, id가 일치하는 시간이 줄어들게 되면서 전기로 생성되는 라인이 상대적으로 적게 만들어지고 금방 사라진다.
다음 시간에는 brute 몸에 흐르는 전기를 만들어보자!
하나하나 알아가는 기쁨이 매우 크다.
그리고 그 기쁨에 비례하는 까먹을까 하는 두려움도 크다.
얼른 알고 있는 것들을 활용해서 작업할 수 있는 날이 왔으면 좋겠다.
'Houdini > Houdini1_Volumes' 카테고리의 다른 글
12_전기에 따른 스파크(PARTICLES) (1) | 2023.03.09 |
---|---|
11_part2. 캐릭터 움직임에 따른 전기 효과 (0) | 2023.03.08 |
10_POINT DEFORM, BRUTE 캐릭터 표면 연기 만들기 (0) | 2023.03.03 |
09_충돌 세팅 2가지, VDB FROM PARTICLES(숙제는 진행중) (0) | 2023.03.02 |
08_연기 모양에 영향을 미치는 것들, POP ADVECT BY VOLUME 적용 (0) | 2023.03.01 |