본문 바로가기

Houdini/Houdini1_Starter

STARTER09_고난주간 3일차_Bounce with Solver

목차

  • 고난주간 2일차 숙제 풀이
  • 오늘의 숙제
  • 일기

정보를 머리에 넣는 것도 중요하지만, 지금은 실력을 키우기 위해 자기 자신을 억지로라도 몰아붙여야 한다. 

고난주간 2일차 과제 풀이

오늘은 간단하다. 대신 오늘의 규칙을 스스로 말로 뱉을 수 있어야 한다.

우리는 이미 속도를 주면 포인트가 움직일 수 있도록 만들어줄 수 있다.

그런데, 공이 벽에 부딪히게 되면 어떻게 될까? → 이부분이 핵심이다.

공이 벽에 부딪혔을 때, 속도가 어떻게 변하게 될지에 대해서 써 내려갈 수 있다면, 만들 수 있을 것이다.

 

임의의 벽이 있다고 가정하고, 그 벽을 튕겨져나오는 공 같은 점의 움직임을 구현해 보자.

 

일단 임의의 벽을 만들어보자.

Grid node를 호출하고 size를 160 by 90으로 만들어준다.

그리고 rows / columns를 2로 설정한 뒤, 아래에 wire노드를 달아주면 외곽선만 남은 모습을 볼 수 있다.

 

이제 add 노드를 활용해서 점을 추가해 주자.

점 하나는 우리가 이동시킬 점이고, 하나는 정보의 다발을 포함하고 solver 안쪽으로 그 정보를 전달할 점이다.

solver 안으로 들어가자.

우리는 input_2(두 번째 input)을 활용할 것이고, 지난 프레임에서 얻은 결과를 활용해서  피드백을 만들어주기 위해 Prev_frame을 사용한다.(당연히 OUTPUT 노드를 만들어서 달아주자)

 

가장 기본적인 이야기부터 하자.

우리가 가진 점이 어디론가 이동을 하였으면 한다. 이때 필요한 것은?

속도에 대한 어트리뷰트가 필요하다.(선생님 강의에서는 v@vel)

@P += v@vel;

그리고, 위에서 만들었던 Grid에 대한 size를 임의로 변경할 수 있는 통제권을 가지고 있었으면 좋겠다. solver안에서 grid가 그려주는 바운더리가 어떤 조건으로 활용될 것이기 때문에 우선순위상, 두번째 인풋으로 들어오는 add 노드 이하의 attribute wrangle에서 사이즈에 대한 통제권을 가지고, grid 노드는 그 정보를 받아서 화면에 그리드를 뿌려주도록 세팅해 보자.

속도에 대한 어트리뷰트 @vel을 만들어주자.

 

그리드의 사이즈를 만들 수 있도록 attribute wrangle을 만들어주자.

grid 노드에서는 위의 내용에 대해 point 함수를 이용해서 값을 가지고 온다.

point("../Grid_size/", 0, "gridx", 0)

※ 주의할 점 - point 함수로 불러오기 위한 gridx, gridy 등과 같은 정보는 attribute로 만들어줘야 불러올 수 있다. 변수로 선언해서 만들어줬을 경우, 노드를 나오는 순간 남은 기록이 없기 때문에 불러올 수 없다.(나도 이것 때문에 잠시 삽질했다)

 

이제 @vel에 의해 점이 움직이도록 solver 내부에 attribute wrangle을 만들어주자.

 

※ Scene view 에러로 인해서 점이 여러 개 보이거나 할 수 있다. 이런 때는 그냥 새로운 Scene view를 만들어주고 기존 Scene view는 꺼주자.

 

오늘의 핵심내용이다.

어떤 조건을 부여해 줘야 우리의 포인트가 바운더리 밖으로 나갔을 때 반대로 움직이게 될까?

solver 안에서, prev_frame이 제공하는 @vel이라는 정보를 어떤 조건에 따라 변형을 줘야 한다. 이 내용은 바로 위에 적힌 점이 움직이게 해주는 wrangle 위쪽에 새로운 wrangle을 달아서 @vel에 변형을 가해주자.

우리가 주목한 부분은 change_vel 노드이다.

 

현재 우리에게 주어지는 @vel은 {1,0,0}이다.

x의 바운더리가 현재 50이라고 가정했을 때, 점이 50을 넘어가게 되었을 때 방향을 {-1,0,0}으로 바꿔주면 될 것이다.

v@vel;
if( @P.x > 50){
        @vel = {-1,0,0};
}

이 방법도 가능은 할 것이다. 하지만 현명한 방법은 아니다. 모든 케이스에 대해 주어지는 @vel을 무시하고 새로운 @vel을 방향에 맞게 설정해 주는 것은 어려운 일이다. 

 

위에 적은 식에서 첫째줄의 v@vel;을 불러온 것은 매우 의미 없는 행위이다. 왜냐하면 불러온 값과는 관계없이 if문 안에서 @vel에 새로운 값을 할당해주고 있기 때문이다. 우리는 이 방법이 아니고, 불러온 @vel에 어떤 변형을 줘서 반대 방향으로 이동하도록 해주자.

v@vel;
if( @P.x > 50){
        @vel = @vel * {-1,1,1};
}

아까 적은 식과 지금 적은 식은 뉘앙스가 굉장히 다르다.(느껴야 한다!!!)

지금 적은 식은 @vel이 'update' 되는 것이고, 아까 적은 식은 @vel에 새로운('new') 값으로 정의되는 것이다.

 

핵심 다 끝났다.

이제 정리만 해주자.

 

우리는 아까 정의했던 gridx, gridy의 값을 point function을 활용해서 solver 내부의 wrangle에 불러올 수 있다.

현재 gridx는 160, gridy는 90이다. 우리에게 필요한 x 바운더리의 한계는 160이 필요한 것이 아니고, 그것의 절반인 80이다.(y 또한 마찬가지로 필요한 바운더리 한계는 절반인 45이다)

이 말은 곧 gridx의 절반이 우리의 if문의 조건을 판별하는 곳에 들어간다는 말이다.

그런데 현재 점의 속도가 매우 느리다. 좀 바꿔주자.

 

solver에 들어가기 전에 우리가 편하게 초기 속도를 조절할 수 있도록 수정해 보자.

 

solver 전에 @vel을 입력받았던 wrangle에서 @vel을 normalize 해주자.

  • normalize는 기존 벡터를 방향이 같고 크기가 1인 벡터로 만들어준다.

그리고 뒤에 channel float을 활용해서 임의의 값을 곱해준다.

이것이 의미하는 것은, 우리가 초기에 입력하게 되는 vel의 벡터 정보는 점의 이동 방향이 되고, mult를 곱해줌으로써 속도를 조절할 수 있다는 것이다. 

 

이제 x 바운더리의 + / - 방향에 대해 적어주자.

아직 y에 대해 작업을 하진 않았지만, x에 대해서는 잘 작동한다.

 

한 가지 팁,

if(A){

        TWA;

}else if(B){

        TWA;

}

이 조건문을 해석해 보자면, '만약 A 조건에 부합한다면 TWA를 수행해줘, 그게 아니고 B라면 TWA를 수행해줘.'라는 의미이다. 이 말을 달리 말해본다면, '만약 A 이거나 B 이면, TWA를 수행해줘.'가 될 것이다. OR 연산(||)이다.

A 또는 B 둘 중 하나가 참이면 조건문 안의 연산을 수행하게 될 것이다.

위의 조건문을 OR 연산으로 정리해 주자.

  • 참고로 OR 연산자는 백스페이스키 근처의 역슬래시 (\ 또는 ₩) 키이다. 

y에 대해서도 계속 작업해 주자.

다 끝났다.

조건을 추가해 보자.

 

부딪히게 되었을 때, 부딪힌 횟수를 수집할 수 있도록 solver를 수정해 보자.

 

하나만 더 해보자. 

xbounce라는 어트리뷰트를 만들고, 점이 부딪히는 순간에만 "yes"를 갖고, 아닐 때는 "no"를 가지도록 만들어보자.

y에도 ybounce를 만들어보자


고난주간 3일차 숙제

  • 오늘은 두개

Crag - test geometry crag

  • pack된 상태이다.
    • 이 pack을 풀어줘야한다.(unpack)
  • Crag의 발자국과 해머가 끌리는 자국을 만들어주자.

 

 

힌트!!

다른 물체가 가지고 있는 어트리뷰트를 거리에 대한 조건으로 가지고 오는 노드가 있다.

  • 일단 당장 떠오르는거 - attribute trasfer 노드의 distance threshold / blend width

숙제1)

add를 활용해서 점을 만들어줬다.

그리고 그 점에 @Cd = set(1,0,0)을 해주고,

Grid에 attribute transfer 노드를 활용하여 넘겨주었다.

그냥 넘겨주면 distance threshold 값 때문에 범위가 넓은데, 이 값을 줄여주고, blend width 값을 적절하게 조정해줌으로써 컬러에 그라데이션이 생기게 할 수 있었다.

볼록 튀어나오게 하는 것은, @Cd.r 값을 @P.y에 넣는 것으로 하였고, 꼬리가 너무 길어지는것 같아서 @Cd.r이 0.05보다 작을 경우에는 @Cd.r 값을 0으로 할당해버리도록 해서 꼬리자르기를 진행하였다.

 

 

 

숙제2)

숙제1을 하면서 흔적이 계속 남게 되는 경우를 접해서 그런가,

이 부분은 나름 스무스하게 넘어갔던 것 같다.

 

추가 - 다시 보니까 발자국 부분이 매우 뭉개져보인다. 저렇게 나오면 안되는거같은데... 맑은 정신으로 다시 도전해봐야겠다. 선생님 예시랑 비교해보니까 색도 다르다... 다 다르다... 다시 하자 다시!!

 

 


선생님 강의를 들으면서 내가 짜놓은 코드를 바라보며 참... 하하 @_@

열심히 하자 열심히...!!

 

과제는 계속 삽질의 연속이었다. 스피어를 가지고 왔다가 스피어 @P.y를 어떻게 하면 그리드에 전달할 수 있을까 막 고민도 해보고 하다가, 결국 attribute transfer 노드에서 blend width 값을 조절해서 컬러 자체를 그라데이션 주고, 그 값으로 그리드의 @P.y를 변경해주었다. 왠지 이 방법이 아닐듯 한데, 지금 당장 떠오르는 것은 이것뿐이네...

숙제 2번은 일단 크래그를 꺼내서 좀 만져봐야 답이 나올 듯 싶다.

만져보니 답이 나온다!!!!

'Houdini > Houdini1_Starter' 카테고리의 다른 글

STARTER09_고난주간 5일차_Gravity & Substeps  (0) 2023.01.26
STARTER09_고난주간 4일차  (0) 2023.01.25
STARTER09_고난주간 2일차  (1) 2023.01.19
STARTER09_고난주간 1일차  (0) 2023.01.19
STARTER08_Solver  (1) 2023.01.18