TWA Houdini1/Starter & Particles

TWA 후디니 1 Particle_08 : 충돌감지(Collision Detect) POP Solver

yiss09 2023. 2. 9. 03:01

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

 

HOUDINI1_ STARTER & PARTICLES

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

www.twahoudini.com

 

Particle08에서는 Particle에서의 Group, 충돌, 스트림에 대해 배우게 된다.  

 

1. 기본 Setting

2. Source의 Group 활용하기

3. Group에 따라 색 입히기

4. 충돌에 대한 조건 이용하기

5. Update Reap

6. POP Wrangle로 Reap

7. POP Properties & POP Collisiondetect

 


1. 기본 Setting

 

grid를 생성해 세개의 작은 grid로 만들어준다. 사이즈는 동일 위치는 x축 방향으로 1씩 차이난다.

이 그리드는 POP source에 들어가게 될 예정이다.

 

Geometry 단계에서 Groundplane의 영역이 되어줄 grid를 생성해준다.

simple과 hard는 rows와 columns를 다르게 설정해준다.(2,2와 401,401)

 

그 다음 Static Object에 들어갈 각기 다른 Object들을 만들어준다.

이때 중요한 점은 Attribute Delete를 통해 Rubber Toy에서 @N을 삭제해주어야 Rubber Toy의 색이 정상적으로 보인다.

아래에 Null node를 달아 이름을 지어준다.

 

Object Merge node를 활용해 Object들을 한꺼번에 볼 수 있도록 정리해주었다.

 

DOP Network 안에서는 앞서 만들어두었던 Source들이 이용될 수 있게 각각의 자리에 알맞게 배치해주었다.

이후 POP Source와 POP Force를 활용해 Particle이 떨어지는 효과를 만들어주었다.

 

 


2. Source의 Group 활용하기

 

우리는 지금까지 1개의 단일 소스만을 이용해왔다. 이제  Group을 이용해 여러  POP Source를 동시에 활용해보자.

 

POP Source의 Source Group을 A로 설정해준 결과 밖에서의 A group의 grid에서만 points가 나오게 되었다.

 

POP Source를 여러 개 복제하여 각각 Source Group을 지정해주었다.

Birth에서 생성되는 points의 수를 전부 다르게 조절해주었다.(300,20,100)

아래에 POP Force를 달아 중력이 모두 다르게 작용되도록 해주었다.

A,B,C 각각 다른 효과의 Particle이 생성되는 것을 볼 수 있다.

 

DOP Import를 활용해 DOP Network에서 p01(particle)의 정보만 가져와준다.

 

이때 DOP Import의 Node Info를 확인해보면 특이한 정보가 있다.

지금까지 설정해온 Points Group A, B, C 세 개를 제외한 stream_popsource1, stream_popsource2, stream_popsource3가 있는 것을 볼 수 있다.

자세히보면 A와 stream_popsource1, B와 stream_popsource2, C와 stream_popsource3의 points 갯수가 동일한 것을 알 수 있다. Scene view로 가서 확인을 해보면 둘은 같은 내용의 Group인 것을 알 수 있다.

 

 


3. Group에 따라 색 입히기

 

이제 POP Color를 활용해 Particle에 색을 넣어준다.

POP Color에서는 색이 들어갈 Group을 지정해줄 수 있는데, 이때 wire로 연결된 Group 정보를 입력했을 때만 작동하는 것을 알 수 있다.

 

 


4. 충돌에 대한 조건 이용하기

 

이제 POP Wrangle을 이용해 조건에 따라 색이 변하게 해보겠다.

1. if문을 사용해 @P.y가 2보다 클 경우 setpointgroup function을 사용해 point group을 생성해주었다.

2. 생성된 "over" group에 새로운 POP Color node를 사용해 주황색을 입혀준다. @P.y가 2보다 큰 수가 나올 때 색이 변하는 것을 확인할 수 있다.

 

1. removepoint function을 활용해 @P.y가 2보다 클 때 point가 사라지도록 해주었다.

2. @P.y가 2보다 클 때 velocity가 -1 곱해져 반대로 떨어지게 해주었다. 2에 다다르는 순간 반대로 떨어지는 point를 확인할 수 있었다.

 

 


5. Update Reap

 

먼저 POP Wrangle을 통해 앞서 만들어 두었던 "over" group이 @dead=1의 내용을 갖게 해주었다.

POP Solver의 Update에는 Reap Particles라는 내용이 있다. 모든 파티클의 @dead가 1로 되어 있을 때 삭제된다는 내용이다. 즉 각각의 points가 가지고 있는 @dead의 내용이 1이 되었을 때 POP Solver에서 point를 지워준다는 의미이다.

체크 해주었을 때는 왼쪽의 Scene view에서 볼 수 있듯이 2 이상의 points가 제거된 것으로 보인다.

 

이해를 돕기 위해 Reap Particles가 체크 해제 되었을 때는 point를 제거하는 기능이 전혀 작동하지 않는 것을 볼 수 있다.

 

Reap At Frame End는 비슷하지만 조금 다른 기능을 가지고 있다.

기능이 켜져 있을 때는 point가 사라지는 순간을 보지 않게 되고, 기능이 꺼져 있을 때는 사진에서와 같이 point가 제거되기 직전의 모습을 확인할 수 있게 된다.

 

 


10. POP Properties & POP Collisiondetect

 

POP Solver의 Collision Behavior 탭에서 Add Hit Attributes를 체크해주게 되면, DOP Import의 Node Info에서 hit에 관한 Point Attributes가 생성된다.

여기서 @hittotal은 Particle이 충돌한 횟수를 기록해준다. hit에 관한 Attributes를 활용해 Particle에 색을 입혀보자.

 

@hittotal을 활용해 조건을 만들었다. @hittotal이 0보다 큰 경우는 한번이라도 충돌이 발생한다는 뜻이다.

즉, 충돌이 발생함에 따라 point의 color가 {1,0,0}이 되도록 해주었다.

 

또한 Collision Behavior에서 Color Hits를 이용하면 똑같은 결과를 낼 수 있다. point가 충돌함에 따라 색이 바뀌게 된다.

 

@hittotal을 이용해 point를 제거해줄수도 있다.

point가 충돌할 때 @dead가 1이 되어 Reap Particles가 작동하게 되는 것이다.

이전의 사진과 같은 Frame인데도 불구하고 튀어오르는 point가 없는 것을 볼 수 있다.

 

지금까지는 POP Object의 Physical을 변경해 물리법칙을 Particle 전체적으로 작동시켰다.

만약 각각의 Source에 물리법칙이 다르게 작용하게 만들기 위해서는 어떻게 해야할까?

 

바로 POP Properties를 사용하면 된다. POP Properties를 효과를 줄 Source 아래에 연결해준다.

원래 POP Object에서의 정보에 POP Properties의 정보가 곱해진 값이 결과로서 적용된다고 보면 된다.

사용할 것들만 체크해 사용해주면 된다. Bounce만 켜주었다.

A에는 0.1, B에는 2의 Bounce를 입력해주었다. 튀어오르는 높이가 확연히 차이가 나는 것을 볼 수 있다.

 

이때 POP Source → POP Force → POP Properties와 같이 한줄의 wire로 연결된 node들의 흐름을 스트림이라고 부른다.

다른 스트림에서의 node는 서로 영향을 주지 못한다.

 

Collision의 효과를 각각의 스트림에 따로 주기 위해 POP Collision Detect node를 사용하였다.

1. 앞선 POP Solver에서의 Collision과는 다르게 POP Collision Detect에서는 반드시 충돌할 Object를 연결해주어야 작동한다.

2. Color Hits 또한 POP Solver에서와 똑같이 작동한다. 이때 반드시 POP Solver에서의 Color Hits는 꺼주도록 하자.

3. Accumulate Hits를 체크하지 않는다면 @hittotal이 연결해둔 Object에 의해서만 증가하게 된다. 체크해주게 된다면 ground와 같이 다른 장애물에서의 hit도 계산하기 시작한다.

 

DOP Import에서 Blast로 떼어낸 B Particle 아래에 Attribute Wrangle을 달아준다.

if문을 사용해 particle에서 충돌하지 않은 부분을 제거해볼 예정이다.

@Cd.r가 0이 아닐 때를 조건으로 사용한 이유는 다음과 같다. 흰색의 기본 색상은 {1,1,1}과 같다. 초록색은 {0,1,0}과 같다. 이때 숫자의 차이가 나는 @Cd.r을 이용해 0이 아닌 points가 전부 제거되게 해주었다.

 

마지막으로 Response는 Particle이 Object에 접촉했을 때 어떻게 반응할지에 대한 내용이다.

None(Unchange)는 아무런 효과가 생기지 않는다.

Die는 point가 Object에 접촉할 때 point가 제거된다.

Stop은 point가 접촉했을 당시의 위치에 멈추게 된다.

Stick은 point가 접촉한 object에 붙게 된다.

Slide는 point가 object를 따라 미끄러진다.

 

왼쪽부터 None, Slide, Die이다.

Slide의 경우는 버전이 달라서인지 강의에서와 같은 모습으로 흘러내리진 않았다.

 

왼쪽부터 Stop, Stick이다.

이 둘은 움직이는 물체에서 차이를 쉽게 파악할 수 있었다.