[OpenClass] 2010-08-22 SOP solver

A.주제/내용

SOP solver

  • 준비사항

houdini help에서 sop solver를 검색 후 sop solver의 'DentingWithPops' 라는 이름의 example file을 불러 옵니다. 플래이 해보면 torus가 파티클에 의해 찌그러지는 것을 볼 수 있습니다.

  • 포인트

dop 네트워크 안에서 sop 데이타가 sop solver에 의해 어떤 식으로 다뤄지는지를 알 수 있습니다. 

  •  세부적인 과정

-여기서 중요한 것은 solvergeo와 sopsolver1 입니다.  이 외의 다른 context를 대략적으로 설명 하자면 sourcegeo에 torus를 만들고 popnet1에 이 torus를 두드리게 될 파티클을 만듭니다. 그리고 각각을 sim에서 상호 작용하게 하기 위해 particles와 dentme 라는 sim object로 불러옵니다. rbd pin constraint는 실에 매달려 있는 것 처럼 sim 동안에 공간에 torus를 묶어 둔 것입니다. 중력값을 적용해서 대롱 대롱 매달려있게 만듭니다.  pop의 경우 간단히 pop solver를 적용해주고 완료 했으나. 파티클이 충돌해 찌그러질 torus를 불러온 dentme의 경우 multy solver를 이용해 rbd solver와 더불어 sop solver를 적용해주고 있습니다. 바로 이 sop solver에 의해 만들어진 geometry의 변형 값이 매 step마다 accumulate되어 rbd 오브젝트에 변형을 주는 것입니다. 그리고 이 변형되는 데이터 값은 바로 solvergeo에서 매 step마다 불러오는 것이구요. solvergeo에서의 변형을 위해서는 다시 sim 데이타를 불러오는 식으로 계속 반복하여 상호작용하는 것입니다.

-solvergeo의 내부 입니다. 형태를 만드는 가장 핵심적인 내용입니다.  노드별로 살펴보도록 하겠습니다.


add1(add) 포인트 하나를 만듭니다.


copy_per_impact(copy) sim에서 파티클과 torus가 충돌할때 만들어지는 impacts 데이타를 기준으로 해당 step에 충돌한 파티클의 개수를 불러와 그 개수만큼 위에서 만든 포인트를 복사 합니다. 예를들어 이번 sim step에 3개의 파티클이 torus에 충돌했다면 3의 값이 return되는 것입니다. 이런 내용의 expression이 number of copies에 입력됩니다. 

dopnumrecords("../..", stamp("../OUT", "OBJID", 0), "Feedback", "Impacts")

dopnumrecords에 대한 내용은 help를 찾아 보시면 쉽게 설명되어 있습니다. 간단히 설명하자면, 지정한 dop 경로의 지정한 오브젝트의 어떤 하위데이타의 특정한 기록이 기록된 횟수를 불러오는 것입니다.


set_point_position(point) 위에서 만들어진 포인트들의 point number($PT)를 기준으로 이 point number와 일치하는 impact index값의 각 impacts들의 위치값을 불러옵니다. 그렇게 해서 위에서 만들어진 포인트들을 각각의 impact가 발생된 위치에 array시킵니다. 이런 내용의 expression이 position의 각 xyz값에 입력이 됩니다.

dopfield("../..", "dentme", "Feedback", "Impacts", $PT, "positionx")
dopfield("../..", "dentme", "Feedback", "Impacts", $PT, "positiony")
dopfield("../..", "dentme", "Feedback", "Impacts", $PT, "positionz")

dopnumrecords에 대한 내용은 help를 찾아 보시면 쉽게 설명되어 있습니다. 간단히 설명하자면,  dentme라는 오브젝트에서 각 point number와 일치하는 impacts의 poxitionx/y/z 값을 그대로 불러오는 것입니다. 파티클과 torus가 충돌이 일어난 지점 입니다.


null1(null)/ impulse_metaball(metaball)/ switch2(switch) 위 그림의 왼쪽을 보면 null1과 impulse_metaball이라는 메타볼이 switch에 묶여 있습니다. 바로 이 메타볼이 저 밑의 magnet노드와 함께 trous에 작용해 torus으 형태를 변형 시키는 것입니다. 일단 아래의 switch2에는 다음과 같은 expression이 지정되어 있습니다.

dopfield("../..", stamp("../OUT", "OBJID", 0), "Feedback", "Impacts", stamp("../copy_metaballs", "copy1_pt", 2), "impulse")>0.1

dopfield로 step에 solve된 오브젝트의 충돌 즉, impacts 충돌 강도가 0.1보다 크면 1, 작으면 0이 리턴 돼서 0일 때는 앞의 null이 1일 때는 뒤의 metaball이 아웃 됩니다. 0.1 이하의 자잘한 충돌로 null이 아웃될 때에는 변형이 일어나지 않도록 되어 있는 것입니다.  메타볼의 weight은 impulse값을 그대로 이용합니다.


copy_metaballs(copy) 위에서 만들어진 null이나 metaball들을 앞서 만들어진 포인트들에 copy합니다. 이제 해당 포인트들의 위치에 메타볼이 적용되어 아래의 magnet노드와 함께 변형이 이루어 질 것입니다.


merge_dop_object(object merge) 여기서는 아래의 expression을 이용해 이전 step의 결과물을 불러오는 역할을 합니다.  이렇게 불러와진 torus에 앞서 만들어진 메타볼 데이터를 magnet에 함께 연결해 변형이 생성되고, 그 결과물이 여기에 다시 불러와져서 계속 형태 변형이 누적이 되는 것입니다.

`stamps("../OUT", "DATHPATH", "../..:dentme/Geometry")`


magnet 여기서는 오른쪽에 입력된 메타볼의 설정대로 왼쪽의 torus를  밀어냅니다.


이런 내용의 결과가sop solver에 의해 매 step마다 반복되어 적용되는 것입니다.

 

B.기타

  •  다음주에 계속 이어집니다.

 

Forums: