https://www.twahoudini.com/course/volumes1
Volume11_part1에서는 전기효과를 만드는 방법에 대해 배운다.
새롭게 Ray node를 배우게 된다.
1. Noise로 전기 느낌 내기, Ray node
2. 표면에서의 전기 효과
3. 예제(electric, 구, 망치)
1. Noise로 전기 느낌 내기, Ray node
전기작업의 큰 순서이다.
1. 시작점과 끝점 정의내려주고 id 일치시키기
2. Noise 패턴 정의 내리기
3. Detail 살리기
먼저 시작점과 끝점을 생성해준다. Null node를 달아 시작점과 끝점을 구분할 수 있게 해주었다. 전기 효과를 만들 때에는 시작점과 끝점을 잘 설정하는 것이 매우 중요하다.
두 점을 Merge하여 Add node로 선으로 만들어주었다.
Start와 End에서의 점을 두개로 늘려주겠다.
점이 하나씩 있을 때에는 큰 문제가 되지 않았지만, 둘 이상이 되면서 point가 가진 id를 이용해야될 상황이 생겼다.
Attributes Wrangle을 생성해 Start와 End 각각의 id를 따로 가지게 해주었다.
By Group에서 By Attributes로 전환 후 id를 입력해주어 같은 id를 가진 point끼리 선으로 연결되게 해주었다.
전기와 같은 느낌의 효과를 주기 위해서 일단 두 개의 line을 Blast로 떼어내어 주겠다.
지금은 point가 2개 밖에 없기 때문에 line에 Noise를 주는 것이 큰 의미가 없다.
Resample로 포인트 수를 늘려주겠다. Length 값을 조절해 point 수를 늘려주었다.
이제 Attributes Vop으로 line에Noise를 줄 예정이다.
각각의 point의 위치에 대해서 어떠한 이동을 해줄 것이다.
위치정보에대해서 Anti-Aliased Flow Noise를 주고, @P 값에 더해주겠다. Signature는 먼저 3D input, 3D Noise를 사용하겠다. line에 Noise Pattern이 적용된 걸 확인할 수 있다.
Noise Pattern이 시간에 따라 움직이도록 만들어주고 싶다. Vector to Vector4를 이용해 위치정보와 시간의 정보를 엮어 Anti-Aliased Flow Noise의 position에 넣어주겠다. Signature를 4D input, 3D Noise로 변경해준다. 시간이 변함에 따라 모양이 변하는 것을 볼 수 있다.
Noise가 일렁이는 속도를 변경해주고 싶다면, Time에 Multiply를 달아 Constant 값을 곱해주도록 한다.
만약 거칠거칠한 느낌을 주고 싶다면 Noise의 Roughness 값을 올려주도록 하자.
우리가 처음에 제공했었던 시작점과 끝점의 위치가 Noise Pattern에 의해 바뀌어 버렸다.
이를 해결하기위해서 Resample node에서 curveu 값을 이용하겠다.
CurveU는 Resample로 선을 쪼갤 때 각각의 point가 선의 어느정도 위치에 있는지를 0~1 사이 값으로 묘사한 것이다.
Attribute Rename을 달아 curveu의 이름을 fxmult로 변경해주겠다.
앞에서 만든 fxmult의 정보를 Noise에 곱해주도록 하겠다. Bind node로 fxmult의 정보를 불러왔다.
fxmult를 곱해주기 전에는 모든 point에 있는 그대로의 Noise가 적용된 상태였다. 그런데 Noise에 fxmult가 곱해진 뒤에는 fxmult에 따라 시작부분에는 Noise가 적게 끝부분에는 많게 적용된 상태가 되었다.
Attribute Rename 아래에 Attribute Wrangle을 하나 달아주겠다. fxmult에 대해서 chramp function으로 변화를 주겠다.
현재 curveu의 모양은 0에서 1의 값까지 올라가고 있는 모양이다. chramp를 통해 그 값을 변경해주겠다.
시작과 끝에 0의 값을 주고 중간에 1의 value를 주어 시작과 끝부분을 제외한 나머지 부분에 Noise Pattern이 적용되도록 해주겠다. 시작과 끝이 고정된 상태에서 Noise가 작동되는 것을 볼 수 있다.
Blast로 떼어낸 line들을 Merge하여 결과를 보겠다.
이때 같은 조건임에도 불구하고 두 line에 적용되는 Noise가 다른 것을 볼 수 있는데, 이는 Noise에 적용되는 Global에서의 @P 값이 서로 달라서이다.
두 선에서 Noise를 준 내용이 중복된다.
For-each Connected Piece를 이용하여 두 line에서 Noise를 주는 내용이 반복되게 해주었다. For-each Connected Piece로 만든 결과와 앞서 만든 결과가 같은 모습을 볼 수 있었다.
이렇게 For-each Connected Piece를 이용하면 두 선뿐만이 아니라 더 많은 line에서의 반복 작업을 쉽게 할 수 있다.
나중에 최종적으로 표면에 흐르는 전기를 묘사할 땐 For-each Connected Piece 안의 내용을 바꿔줘야할 것이다.
이번엔 Start와 End의 점의 위치가 변하도록 해줄 예정이다. 두 개의 벽 사이에 전기가 흐르면서 위로 올라가도록 만들어볼 예정이다.
Box를 두 개 생성하여 y축으로 길이가 길어지도록 해준다.
이제 안쪽 벽에 점을 만들어줄 예정인데, 처음엔 움직이는 점이 아니어도 좋다. 각 Box의 안쪽 면에 5개씩 점을 생성해주도록 하겠다.
Box의 안쪽 면을 Group으로 지정해주겠다. Scatter로 Group에 점을 5개 뿌려주겠다.
두 벽의 점들을 연결해 선으로 만들어줄 예정이기 때문에, Attribute Wrangle을 만들어 id에 관한 내용을 작성해준다. id에 의해 같은 id의 point끼리 선으로 연결된 것을 볼 수 있다.
앞서 만들어둔 Noise를 주는 내용을 가진 For-each Connected Piece로 해당 내용에 Noise를 주었다.
지금은 시작점과 끝점의 위치가 변하지 않기 때문에 고정된 상태에서 전기가 흐르는 것처럼 묘사된다.
이제 Start와 End의 점이 위로 올라가게하여, 전기가 위로 올라가는 효과를 만들겠다.
point가 그럴싸하게 움직이도록 만들고 싶기 때문에 POP Solver를 이용해 만들어볼 예정이다.
두 Box 가운데에 POP Solver에서 쓸 Source를 만들어보겠다. 두 Box 사이에 위치한 Size 2x2의 YZ Plane의 Grid를 생성한다.
Grid에 Scatter를 달고 Global Seed에 $F 값을 주어 매 프레임마다 다른 곳에서 point가 생성되도록 해주었다.
해당 내용이 Particle에서의 source 역할을 할 것이다.
Dop Network를 만들어 POP Solver 세팅을 해주겠다.
POP Source의 Type을 All Points로 하고, SOP Path를 방금 만들어둔 source로 지정해주었다.
그리고 points가 위쪽으로 날아갈 수 있도록 POP Wind를 달아주었다. Wind Velocity의 y값만을 높여주었고, Amplitude와 Swirl Size를 조절해 위를 향하는 흐름에 Noise를 주었다.
현재 제공되고 있는 points가 너무 많다고 느껴진다.
Scatter에서의 값이 이미 1로 더이상 줄일 수 없기 때문에 다른 방법을 사용해보겠다.
Scatter node 아래에 Switch node를 달아 평소엔 Null node로 작동하였다가 특수한 조건에 의해 Scatter로 점을 뿌리도록 만들어주었다. Switch node의 파라미터에 $F%2==1을 적어, 프레임을 2로 나누었을 때 그 나머지 값이 1이 되었을 경우에만 Scatter로 점을 뿌리도록 해주었다.
점들이 생성되는 순간 올라가는 속도가 느리다고 느껴진다.
point가 출발하는 순간의 속도를 높여주기 위해서, source 정보에 Attribute Wrangle을 달아 @vel의 y 값을 올려주겠다.
이제 Grid에서 만들어준 결과를 Box의 안쪽면에 붙여줄 예정이다. 새롭게 Ray node를 사용해주겠다.
Ray node는 Method를 Minimum Distance로 사용하면, Input 1으로 들어오는 내용을 Input 2로 들어오는 Reference의 가장 가까운 위치에 붙일 수 있다.
Ray node의 Input 1에 DOP Network를 연결해주고, Input 2에는 Box를 연결해주었다.
Method를 Minimum Distance로 변경하니, Box 안쪽 면에 points가 잘 붙은 것을 확인할 수 있었다.
이제 Particle의 내용을 복사하여 끝점에 붙여넣어주겠다. 똑같이 Ray node를 활용하여 안쪽 면에 points를 붙여주었다.
이때 하나 변경할 점이 있다. 끝점의 Scatter node에서의 Global Seed에 다른 값을 더해주어, 시작점과 다르게 point가 생성되도록 해주었다.
이제 Noise 효과를 준다면 points의 위치에 따라 전기와 같은 효과가 위로 올라가는 것을 볼 수 있다.
여기서 아쉬운 점이 있다면 전기가 사라지지 않고 계속 쌓이고 있다.
전기가 사라지는 효과를 만들어주기 위해서 POP Source의 Life 값을 줄여주었다.
Start와 End의 Life 값을 동일하게 해주어야 사라지는 순간이 같을 것이다.
만약 조금 더 빠르게 올라가길 원한다면 POP Wind에서의 값을 수정해주면 된다.
이제 Ray node의 Input 2로 들어가는 정보를 바꿔볼 예정이다. 움직이는 물체를 만들어 그 물체에 points를 붙여주려한다.
Box를 생성해 y값을 늘려 길죽하게 만들어준다. Transfrom으로 두번 Rotation해주어 해당 Object들을 Merge해준다.
Merge해준 Object 아래에 Transform을 달아서 매 프레임마다 Rotation되도록 해준다.
해당 Object를 그대로 이용하기에는 Ray node로인해 points가 붙여졌을때 문제가 생길 부분이 보인다. 바로 면과 면이 겹치는 부분에 의해 겹치는 부분 안쪽에 point가 생성될 가능성이 있다.
이를 해결하기위해 SDF VDB로 한번 변환해준 뒤, 다시 Polygons로 변환해주는 과정을 거쳐주겠다.
Ray node의 Input 2에 움직이는 Object를 넣어준다.
Object가 회전함에 따라 매 Frame마다 가장 가까운 점으로 points가 붙는 것을 볼 수 있다.
Transform으로 Start와 End에서의 Object의 거리를 2만큼씩 벌려준다.
그런데 Noise의 효과가 들어간 결과에서 아쉬운 점을 발견할 수 있다. 여러 점들이 한 곳으로 모일 경우 Noise Pattern이 동일하게 나타나는 경우를 볼 수 있다.
이를 해결하기 위해서 Noise의 정보가 있는 Attribute Vop을 수정해주었다.
Anti-Aliased Flow Noise로 들어가는 position 정보에 Float to Vector를 이용하여 해당 y값에 id 정보를 더해주었다. 이로인해 id가 전부 다른 line들은 전부 다른 Noise Pattern을 가지게 되었다.
만약에 전기효과가 들어가는 부분을 조절해주길 원한다면 fxmult의 Ramp parameter를 조절해 그 구간을 변경해줄 수도 있을 것이다.
2. 표면에서의 전기 효과
이제부터는 좀 더 시작점과 끝점을 능수능란하게 다룰 수 있어야 한다.
Grid 위에서 원하는 경로로 전기가 흐를 수 있어야 한다. 하나의 전기가 Grid의 왼쪽에서 오른쪽으로 움직이도록 만들어볼 예정이다. 왼쪽에서 오른쪽으로 이동하는 line이 존재하고, 이 line이 전기처럼 보이게 만들 예정이다.
Noise가 line에 발생하게 되는데, 시작부터 Noise가 점점 세지다가 중간쯤에서 가장 쎄지고 그 이후엔 line의 길이가 점점 짧아지고 Noise 또한 약해지면서 끝으로는 소멸하도록 만들어보겠다.
우선은 Add를 이용해 기본적인 경로를 만들어주겠다. 만들어진 line 아래에 Carve를 달아주겠다. SecondU 값과 FirstU 값에 의해 line의 위치와 길이가 조절된다.
이때 SecondU와 FirstU를 조절하기 위해서 Carve 아래에 Attribute Wrangle을 하나 만들어주겠다.
SecondU에 대한 chf을 만들어주고 해당 파라미터에 Animation을 주겠다. Carve node의 SecondU에 point function으로 앞서 만든 SecondU의 정보를 불러온다.
FirstU 값 또한 앞선 Attribute Wrangle에서 생성해주는데, 이때 FirstU 값은 절대로 SecondU 값보다 높아서는 안된다. 끝점이 시작점을 앞서게 되기 때문이다.
이를 방지하기 위해서 FirstU 값은 SecondU로 chramp를 만들어 0~1 사이의 value를 조금 낮추어 SecondU 값보다 FirstU 값이 항상 적도록 해주었다. 이때 0과 1의 value 값은 건들지 않는다. Ramp의 Interpolation을 Bezier로 바꾸면 부드러운 모션을 만들 수 있다.
FirstU 값 또한 Carve node에서 point function으로 불러와준다.
끝점이 시작점을 따라가다가 마지막에서는 시작점을 따라잡으면서 소멸하는 line Animation이 만들어졌다.
Noise에 대한 내용을 가져와 붙여넣어 주었다. Noise의 효과를 가지고 꿈틀거리며 이동하는 line이 생성되었다.
지금부터는 전기가 표면 위를 다니는 것처럼 묘사해주려 한다.
여태 만든 Noise는 표면 위를 다니는 것이 아닌, 단순히 점 앞뒤로 Noise가 존재할 뿐이었다.
가져온 Noise를 다시 지우고 전기가 될 기본 Shape을 먼저 만들어주겠다.
Grid의 Rows와 Columns을 200x200으로 늘려주겠다.
Grid에 Mountain을 달아 Amplitude와 Element Size 값을 높여주었다.
앞서 만들어둔 line Animation을 Ray를 이용하여 Grid와 Mountain에 붙여 비교해보겠다.
먼저 Grid에서의 결과이다. line Animation이 Grid에는 붙어서 움직이고 있다.
하지만 Mountain에서는 붙어서 움직이기는 하나, 부자연스러운 움직임을 보여주고 있다.
그 이유는 line이 두 개의 points만을 가지고 있기 때문이다.
Resample로 line에서의 points의 개수를 늘려주겠다.
이전보다 좀 더 Mountain의 굴곡을 잘 따라가는 것을 볼 수 있다.
이때 Ray에 의해 points가 가장 가까운 곳을 찾아 Mountain Grid에 붙으면서 점과 점 사이의 간격이 많이 변경되었다. 어떤 구간은 점과 점 사이의 간격이 굉장히 넓고, 어떤 구간은 엄청 좁은 것을 볼 수 있다.
Noise의 효과를 줄 예정이기에 points간의 균일한 간격을 원한다. Ray node 아래에 다시 Resample node를 달아 간격을 균일하게 맞춰주겠다.
우리가 묘사하고 싶은 것은 전기이기 때문에 모든 line이 표면에 착 달라붙어있기보다는 시작과 끝부분만 붙어있고 나머지 부분은 살짝 떠있었으면 한다. 이렇게 떠있게 된 부분에 Noise를 주려한다.
line이 표면보다 살짝 떠있게 만들기위해서 표면에서의 Normal 정보를 구해 그 값을 line의 @P에 더해줄 것이다.
이때 curveU를 chramp로 변환한 값을 곱해준다면, 어떤 구간에 어떠한 높이 변화를 줄지 정해줄 수 있을 것이다.
먼저 Mountain에서의 Point Normal 정보가 필요하다. Normal node를 Mountain 아래에 달아준다.
구해준 Normal 방향을 토대로 line Animation이 Normal을 가지도록 해주겠다.
Ray node에서의 Import Attributes for Hits는 Input 1의 정보를 Input 2에 붙였을 때 Input 2에서의 Attributes를 가져올 수 있게 해준다. Normal 정보를 가져오겠다.
구해준 Normal 정보를 기반으로 line Animation의 위치정보를 변환해주겠다.
line의 위치정보에 @N을 더해주었다. 이때 line의 시작과 끝점도 같이 높아지는 경우가 발생하기 때문에 @N에 curveU 값을 곱해주었다.
이전의 Resample node에서 만들어둔 CurveU 값을 토대로 shapemult라는 이름의 chramp를 만들어주었다.
Ramp parameter를 조절하여 시작과 끝점을 제외 중간 부분의 value를 높여주었다.
시작과 끝점은 고정된 상태로 line의 높이가 높아진 것을 볼 수 있다.
만약 그럼에도 불구하고 line이 너무 높다고 느껴진다면 shapemult 뒤에 소숫점의 float 값을 곱해주도록 하자.
만약 Noise를 연결해주었는데 그 세기가 너무 쎄다고 느껴진다면, Attribute Vop에서 noise 값에 multiply를 달아 Constant에 의해 그 값을 조절할 수 있다.
이제 또 다른 것을 수정할 차례이다.
초반에 line Animation이 시작될 때 line의 길이가 짧음에도 불구하고 너무 높게 line이 떠서 예쁘지 않은 모양을 가지게 된다.
distance function을 사용하여 line Animation의 길이에 따라 높이가 결정되도록 해주겠다.
Carve node 아래에 Attribute Wrangle을 달아주었다. 이때 Attribute Wrangle이 달리는 위치의 이유를 잘 인지하고 있어야한다.
clamp function으로 너무 높은 값들은 1로 맞춰주었다. @N에 구해준 distance 값을 곱해주었다.
길이가 잘 줄어든 것을 볼 수 있다.
여기서 좀 더 전기같은 느낌을 주려한다. 이제 시작과 끝점이 Noise에 의해 움직이도록 만들어줄 예정이다.
Carve node 아래에서 각각의 point를 Blast로 떼어내어 따로 Noise 작업을 해주겠다.
point의 위치정보에 Anti-Aliased Noise를 더해주었다.
둘의 차이를 주기위해서 시작점에는 Noise의 Offset 값을 변경해주었다.
Carve에서의 결과에서 잘 벗어나 움직이는 것을 확인할 수 있다.
시스템이 잘 작동하는지 확인하기 위해서 경로를 직선에서 원형으로 변경해보았다.
원의 경로를 따라가며, Mountain에 잘 붙어서 움직이는 것을 확인할 수 있었다.
3. 예제(electric, 구, 망치)
이제 굵직한 효과의 기본은 전부 잡혀있기 때문에 line Animation만 잘 만들어주면 된다.
Size 1x1의 Grid를 만들어 POP Solver의 Source로서 이용해주겠다.
Dop Network를 만들어 POP Solver 설정을 해주었다.
POP Source의 Birth를 10개로 설정해주었고, Life를 1,1로 설정해주었다.
POP Wind를 달아 Amplitude 값을 높여 Particle이 Noise에 따라 퍼져나가게 해주었다.
POP Object의 Object Name을 particle로 설정하여 Dop Import에서 볼 수 있게 해주었다.
Dop Import에 Trail과 Add를 달아 line Animation을 만들어주었다.
이제 전기와 같은 효과를 주어야하는데 우리가 이전에 만들어두었던 효과는 단일한 하나의 선에 대해서 효과를 주게 되어 있다. 반복문을 사용하여 여러선에 대해서 효과를 주도록 만들어주자.
For-Each Connected Piece를 방금 만들어준 line Animation 아래에 연결해준다.
전기의 효과를 전부 For-Each Connected Piece 안으로 넣어 연결해준다.
Mountain node의 지면을 따라 움직이는 전기효과가 만들어진 것을 볼 수 있다.
이번엔 반복문 안의 내용을 정리해주겠다. 먼저 반복문을 지워준다.
Subnetwork를 생성해준다. Subnetwork의 input 1에 들어갈 정보를 line_animation, input 2에 들어갈 정보를 ray_object라 하겠다.
Ray node에서 Input 2에 들어갔던 Mountain에 대한 내용을 ray_object 위로 옮겨주겠다.
line Animation을 제외한 나머지 내용은 전부 Subnetwork로 넣어준다.
Subnetwork 안에서 1번을 Animation에 연결해주고 Ray node의 input 2 부분에 Subnetwork의 2번을 연결해준다.
그 다음 내부의 전체 node를 다시 For-Each Connected Piece 안으로 연결해주겠다.
완성된 Subnetwork의 이름을 eletric이라고 변경해주었다.
이제 앞서 만든 사방으로 퍼지는 전기가 어떠한 방향성을 가지고 움직이도록 만들어주려한다.
POP Wind에서 x축 방향으로 바람이 불도록 해주겠다.
너무 중앙에서 points가 발생하는 것 같으니 grid의 위치를 x축 방향으로 -2만큼 움직여주겠다.
새롭게 Sphere를 Source로 하는 line Animation을 만들어보겠다.
Dop Network에서 POP Solver 세팅을 해주고, POP Wind를 달아 y축으로 2만큼 바람이 불도록 해주었다.
Ray node에 Dop import와 Sphere를 연결해주었다.
Point들이 마치 Sphere 위로 올라가는 것처럼 묘사되고 있다.
Ray node 아래에 Trail과 Add를 달아 line으로 line으로 만들어주었다.
Electric Subnetwork에는 Normal의 정보가 들어있지 않기 때문에 2번에 points Normal을 달아준다.
결과를 보니 전기가 흐르는 듯한 느낌이 아니라 무언가 지렁이가 올라가는 듯한 모양이다.
이는 Trail로 인해 경로를 정직하게 따라가는 느낌이 들면서 전기와 같이 튀는 느낌이 사라졌기 때문이다.
이제 Dop Network를 2개 사용하는 방법으로 다른 느낌의 전기를 만들어보겠다.
이미 앞에서 해보았던 방법이다.
두 개의 Source를 만들어 각각의 동일한 id 값을 이용해 line을 생성하는 방식이다.
이때 생성되는 points의 갯수는 Switch node로 조절해주었다.
훨씬 Dynamic한 전기 효과를 만들 수 있었다.
Sphere가 들어가는 부분에 Box를 넣어준다면 막대기에 전기가 흐르는 듯한 효과도 만들 수 있다.
이제 최종적으로 망치에 전기가 흐르는 효과를 만들어볼 차례이다.
Crag를 만들어 Unpack 해준 뒤 정지상태의 Animation에서 Hammer를 따로 떼어내어주겠다.
Transform으로 Hammer의 크기를 키워주겠다.
앞서 만들었던 효과에서 Sphere의 위치에 Hammer를 교체해주겠다.
현재 Dop Network 안에서의 내용이 Wind 빼고는 전부 동일하다. 그래서 시작점과 끝점이 나타나고 사라지는 타이밍이 동일하다.
만약 한쪽 POP Source의 Birth의 Seed 값이 바뀐다면 결과가 어떻게 될까?
이전보다 뭔가 껌뻑껌뻑하는 느낌의 효과가 발생한 것을 볼 수 있다. 그 이유는 Birth에 Seed 값이 바뀌면서 id가 일치하는 경우가 이전보다 줄어들었기 때문에 line의 갯수가 줄어듦과 동시에 point로 보이는 것들이 생겨났기 때문이다.
이때 전기의 양을 다시 늘리면서 껌뻑껌뻑하는 효과도 유지하고 싶다면 Switch node에서 생성되는 양을 늘려주면 된다.
'TWA Houdini1 > Volumes' 카테고리의 다른 글
TWA 후디니 1 Volume_12 : 전기에 따른 스파크(Particles) (0) | 2023.03.11 |
---|---|
TWA 후디니 1 Volume_11_02 : 캐릭터 움직임에 따른 전기 효과 (0) | 2023.03.07 |
TWA 후디니 1 Volume_10 : Point Deform, Brute 캐릭터 표면 연기 만들기 (1) | 2023.03.05 |
TWA 후디니 1 Volume_09 : 충돌 세팅 2가지, VDB from Particles (0) | 2023.03.01 |
TWA 후디니 1 Volume_08 : 연기 모양에 영향을 미치는 것들 ; 횃불 만들기 (0) | 2023.02.28 |