TWA Houdini1/Starter & Particles

TWA 후디니 1 Particle_07 : Star

yiss09 2023. 2. 8. 03:59

https://www.twahoudini.com/course/starterparticles1

 

HOUDINI1_ STARTER & PARTICLES

1️⃣ 후디니 작업을 위한 기본 프로세스 이론을 공부합니다. SOLVER 작동 개념을 훈련하고 PARTICLE 시스템을 구현합니다.

www.twahoudini.com

 

1. point를 규칙에 따라 생성되게 해주는 방법

  1.1 %(modulo)를 활용해 조건을 주는 방법

  1.2 확률을 활용하는 방법

2. 면적에 따라 point의 출력량을 조절하기

3. 경로를 따라 움직이는 Source 만들기(Star)

4. Let's Render

 


1. point를 규칙에 따라 생성되게 해주는 방법

  1.1 %(modulo)를 활용해 조건을 주는 방법

 

먼저 규칙에 따라 포인트를 생성했다가 사라지게 하는 방법으로 Switch node에서의 If문을 이용하였다.

Expression에서의 If문은 Attribute Wrangle의 If문과 차이가 있다.

Expression에서의 If문은 이와 같다.

if(조건,참,거짓)

0번 input으로 들어온 점의 정보를 참으로 두고 1번 input의 null 정보를 거짓으로 둔다.

이때 규칙적인 point의 생성을 위해 조건에서는 %(모듈로)를 사용하였다.

띄엄띄엄 규칙성에 따라 생성된 points를 볼 수 있다.

 

이렇게 Merge node를 활용해 규칙이 다른 두 개의 point를 동시에 생성시킬 수도 있다.

 

똑같은 방식의 points 생성을 Attribute Wrangle를 이용할 수도 있다.

1. 사전된 input 0의 정보 없이 Attribute Wrangle만을 이용해 내용을 만들 예정이기 때문에 Detail(only once)를 사용해준다.

2. %(modulo)를 활용해 조건을 미리 만들어준다. 이때 @Frame은 float의 정보이기 때문에 반드시 앞에 integer 정보로 변환해주도록 하자.

3. if문을 활용해 조건이 유효할 때 point가 addpoint를 활용해 point를 생성하도록 하였다. 이때 조건문에서 같은 내용의 결과를 도출할 시 ||(or)을 사용할 수 있다.

 

 

  1.2 확률을 활용하는 방법

 

%를 활용하는 앞선 방법과 다르게 확률을 이용하는 방법이다.

1. 0~1 사이의 random한 값을 float prob라고 정의내려준다. 이때 @ptnum을 활용해 point number에 따라 값이 달라지게 만든다. 또한 @Frame을 곱해주어 Frame에 따라 값이 달라지게 만들어준다.

이때 @ptnum과 seed만을 더해서 값을 도출하려 하면 seed가 0일때 @ptnum이 0이 되면 prob는 0이 되게 되기 때문에 뒤에 아무 float 값을 더해줌으로써  prob가 0이 되는 것을 방지해준다.

2. 만약 정해둔 limit 값보다 random한 prob의 값이 작으면 removepoint를 통해 point가 제거되도록 해주었다. 이후엔 limit 값의 크기를 조절함으로써 생성되는 포인트의 빈도를 조절해줄 수 있다.

 

 


2. 면적에 따라 point의 출력량을 조절하기

 

Scale Point Count by Area를 체크함으로써 Reference Area를 사용할 수 있게 된다.

현재 사진에 적혀 있는 정보로 설명해보자면 Reference Area는 단위(초) 면적 10 당 points가 5000개 나온다는 것이다.

 

Scale Point Count by Area 사용 전 후의 모습이다.

Cons.Birth.Rate가 5000으로 같음에도 불구하고 Reference Area에 1을 주었더니 사용 전과 후의 points 갯수가 확연히 차이가 나는 것을 볼 수 있다.

 

 


3. 경로를 따라 움직이는 Source 만들기(Star)

 

별 모양으로 움직이는 Particle을 만들 예정이다.

별 모양의 동선을 얻기 위해 Circle node의 Division을 5로 낮추어 별의 꼭짓점이 될 points 5개를 얻어주려 한다.

 

Circle에서 얻게된 points들을 blast로 각각 떼어낸 뒤 별 모양으로 만들기 위해 Circle에서의 point number를 기준으로 순서 작업을 해준다.

0번에서 출발할 예정이기 때문에 0 → 2→ 4 → 1 → 3 순으로 배치해준 뒤 Merge 해준다.

그 뒤 Add node를 활용해 선으로 만들어 줄 예정이다. 이때 처음 시작했던 point인 0 point가 마지막으로 배치되지 않는다면 선은 완전한 별모양이 아닌 마지막 line이 끊어진 모습이 될 것이다. 이에 0 point를 맨 마지막에 달아준다.

 

방금 만들었던 별 모양을 여러번 반복하는 particle을 만들어줄 예정이다. Merge 아래에 null node를 여러번 달아 마지막에  0번 point로 마무리해준다면 여러번 반복하는 별 모양을 만들어 줄 수 있게 된다.

points의 반복을 위해 Copy with Stamp node를 활용해 쉽게 반복 횟수를 조절해주자(points를 복제함).

이후 Add node를 활용해 points를 line으로 만들어준다.

 

이제 만들어진 line에 3가지 방법으로 Animation을 줄 예정이다. 비교해보며 살펴보자.

 

먼저 Carve의 SecondU 값에서만 Animation을 주는 방법이다. 설정된 Frame과 값에 따라 line이 별모양을 만드는 Animation이 생성된다.

이때 별을 그리는 움직임을 하고 있는 point를  따로 떼어내고 싶다. 하지만 꼭짓점을 지날 때마다 point number의 수가 증가하기 때문에 움직이고 있는 point를 특정하기 어렵다.

 

Sort node를 활용해 point number를 Reverse 해줌으로써 간편하게 문제를 해결하였다.

Blast node를 활용해 0번 점을 떼어내어 Source로 활용해준다.

 

그 다음은 Carve node만을 이용한 방법이다.

이번엔 FirstU 값도 같이 사용을 해준다. SecondU에는 앞선 Animation과 같은 내용이 들어가게 된다.

SecondU의 내용을 FirstU에 Copy Parameter 해준 뒤 0.01의 값을 빼주어 FirstU가 SecondU 보다 항상 0.01만큼 작은 값이 되도록 해주었다.

SecondU의 뒤를 FirstU가 0.01 만큼의 간격으로 쫓아가는 Animation이 만들어졌다.

하지만 완벽하지는 않다. 그 이유는 결국 마지막 Animation에 가게 되면 line이 사라지는 그림이 아니라 0.01의 차이에  의하여 line이 유지되는 그림이 나오기 때문이다.

 

이번에는 Animation Editor를 사용하는 방법이다.

먼저 FirstU와 SecondU에 들어가는 Animation의 내용을 동일하게 설정 해준다.

 

그 다음 Animation Editor에 들어가 Carve node에서의 Animation을 수정해준다.

아래의 조종선을 당겨 FirstU 값을 SecondU에 비해 조금 느리게 해준다.

이렇게 되면 중간 지점에서는 SecondU를 따라가는 FirstU가 만들어지다가 마지막엔 둘이 하나의 point가 되는 Animation이 된다.

 

맨 왼쪽부터 SecondU 값에서만 Animation을 주는 방법, FirstU값에 float값을 빼주는 방법, Animation Editor를 활용한 방법이다.

마지막 방법으로 남은 작업을 이어가겠다.

 

이제 별 모양의 얇은 line에서 Particle을 뿜어내는 것이 아니라 별을 더 굵게 만들어주기 위한 작업에 들어가겠다.

그러기 위해선 line을 points로 만들어주어야 한다.

Scatter node로 점의 갯수를 조절해준다. 이때 Force Total Count가 사용된다.

 

그 다음 Point Jitter node로 점을 흩뿌려준다. Scale을 조절해 적당한 두께를 설정해준다.

여기서 조금 더 효과를 줘 보려고 한다. 바로 line의 앞쪽의 points 농도가 뒤쪽에 비해 더 진해지게 만들어주려한다.

 

Scatter node 앞에 Resample node를 달아준다. Resample node로 생성된 points에 float(@ptnum)/@numpt를 활용해 0~1 사이의 값을 준다. 지금까지는 이러한 방법으로 line에서 0~1 사이의 값을 주었다. 하지만 다른 더 쉬운 방법이 존재한다.

 

1. 바로 Resample node에서 Curve U Attribute를 활용하는 방법이다. 기본값으로 curveu가 적혀 있으나, 이름을 변경하여 사용 가능하다.

2. Segments보다는 Length를 활용하는 이유는 아마 이후 Particle에서 좀 더 가볍게 작업하기 위해서라고 추측한다.

 

1. 0~1 사이의 값인 twa를 chramp에 넣어 f@density를 생성해준다.

2. Scatter node에서 Generate를 By Density로 설정해준 뒤 앞에서 만들어두었던 f@density 값을 Density Attribute에 넣어 밀도의 값으로 이용해준다. Density Scale을 조절해줌으로써 points의 양을 조절해줄 수 있다.

3. chramp에서의 그래프를 조절해 앞쪽에 points가 몰려있고 뒤쪽으로 갈수록 양이 줄어들도록 설정해주었다.

 

Density에 따른 효과를 주기 전과 후이다.

Source 작업이 완료되었다.

 

DOP Network에서의 작업이 시작되었다.

POP Source에서의 Emission Type은 All points로 설정해두었다. All points의 경우엔 Impulse Count 만을 사용하기 때문에 Source에서의 Scatter 양 조절만으로 points 수를 정할 수 있다.

이제 POP Source에서의 Attributes, POP Wind와 POP Force에서의 Amplitude와 Swirl Size조절을 통해 Particle의 모양이 마음에 들때까지 tweak 해주자.

이때 POP Force에서의 Force.y도 건드려 중력의 세기도 정해주자.

만족스런 결과를 얻었다면 File Cache node를 DOP Network 아래에 연결해 앞선 내용들을 저장해준다.

 

1. @age/@life를 통해 0~1 사이의 @play를 구해준다. @play의 값을 Cd과 Alpha의 chramp에 넣어준다.

2. 노란색 빛을 제일 앞에 조금 넣어준 뒤 흰색, 하늘색, 파랑색을 넣어 색을 배치해준다.

3. Alpha 값을 조절해 끝부분의 Particle이 사라지는 듯한 느낌을 주었다.

 

1. @pscale을 조절해 points 사이즈를 조절해주었다. Render view에서 보일 points의 실제 사이즈를 조절해주는 것이다.

그 다음 Copy to Points로 points에 primitives 정보를 주었다.

2. 빛나는 효과를 위해 material에 Constant를 사용하였다.

 

 

 


4. Let's Render

 

렌더링을 위해 여러가지 해상도의 카메라를 셋팅해주었다.

Particle의 밀도, point의 갯수, point size, 카메라 해상도는 서로 아래와 같은 상관관계를 가진다.

밀도 = (갯수 * size) / 해상도

하지만 위의 공식은 완벽한 식이 아니다. 단지, 원하는 밀도를 찾아가는데 이해를 돕기 위함이다.

만약 1K 해상도에서 마음에 드는 갯수와 size를 정했다. 이때 해상도를 높인다면 밀도가 바뀌어 원하는 느낌이 나지 않게 될 것이다. 해상도가 높아짐에 따라 point의 퀄리티가 상승해 가루보다는 sphere의 느낌을 가지게 될 것이다. 따라서 point size를 낮추게 될 것이고, 그에 따라 point의 갯수도 늘려주게 될 것이다.

 

chramp에서 색상을 변경하면 붉고 검은 별도 만들어낼 수 있다.

 

해상도에 따른 차이에 대한 사진 자료는 렌더 도중 후디니가 계속 꺼지게 남기지 못하였다(ㅠㅠ).

 composite 작업마다 후디니가 터지니 스트레스도 받는다... 이제 더이상 컴퓨터 업그레이드를 미룰 수 없는 시점이 왔다. 렌더링 수업을 따라가려면 얼른 컴퓨터를 업그레이드 시켜야겠다...ㅠ 내일 바로 인터넷 서칭에 들어가보려 한다.

 

과제는 내일 제출하겠다. 너무 수업을 못따라가는 것 같아 걱정이 이만저만이 아니다.