[Sop Solver] 예제파일 DentingWithPops에 대한 나름의 분석.. ^^;
안녕하세요. 이인성입니다.
Sop Solver의 헬프문서에 있는 예제파일 DentingWithPops에 대한 제 나름대로의 분석입니다. 잘못된 부분이 있을수도 있지만 우선 편한 마음으로 글을 써볼 생각입니다^^; 틀린부분이 있으면 말씀해주세요 ㅎㅎ
우선 dopnet 네트웍에서 sopsolver를 제외하고 살펴보면 rbd object를 rbdpinconstraint 노드로 컨스트레인 하고 파티클과 충돌시키는구성 입니다. 여기에 multisolver를 통해서 rbdsolver와 sopsolver를 함께 사용하는것이 특이(?)한 부분이었습니다.
그럼 예제의 핵심인 sop solver와 solvergeo 안의 네트웍을 중심으로 한 번 살펴보도록 하겠습니다..
1. 시작.
Sop solver -
sop solver라는 이름에서 알 수 있듯이 sop 네트웍을 통해서 오브젝트를 제어하는 solver인데, 헬프문서를 살펴보면 sop 네트웍에서 global parameter를 얻기 위해서 stamp나 stamps함수를 사용할 수 있다는 부분이 있더군요. (얻을 수 있는 global parameter는 ST, TIMESTEP, OBJID, OBJNAME, OPNET, DATAPATH 자세한 내용은 헬프를 참조해주셔요 ㅎㅎ) 처음 예제파일을 열고 살펴보니 stamp함수가 많이 나오는데 제가 평상시에 알고 사용하던것과는 다른 모습이더군요.. 헬프문서를 보고 나서야 이해할 수 있었습니다.
solvergeo의 네트웍 흐름 -
solvergeo안의 전체적인 흐름은 dop에서 rbdobject로 사용된 torus에 파티클이 충돌한 부분에 메타볼을 생성하고 magnet노드를 통해 deform을 주는 것입니다.
본격적으로 파해치기(?)에 앞서서 우선 예제에 사용된 함수에 대해 알아보자면 ..
dopfield() - DOPs의 각 parmeter값을 float형태로 리턴
dopnumrecords() - 지정된 타입이 가지는 데이터 갯수를 리턴
stamp() - 여기에선 위에서 언급한 헬프문서의 내용 처럼 sop네트웍이 DOPs에서 가지는 Global Parameter를 얻기위해 사용됩니다.
자세한 내용은 역시sop solver의 help문서를 참조하시기 바랍니다.. ^^;;
2. 충돌지점에 포인트를 생성하기.
copy_per_impact 노드는 프레임별로 오브젝트와 파티클의 충돌이 일어난 갯수대로 포인트를 복사하기위한 것입니다.
number of copys 파라미터를 보면 dopnumrecords("../..", stamp("../OUT", "OBJID", 0), "Feedback", "Impacts") 요런 익스프레션이 들어가있는데, 이 익스프레션의 역할은 해당 frame에서 오브젝트와 파티클간에 일어나고 있는 충돌 데이터의 갯수를 리턴하는 것입니다. (다시 말해서 해당 프레임에 오브젝트와 충돌하고있는 파티클이 '3'개라면 copy 노드의 number of copys 파라미터에 '3'이 들어가는 것입니다. 그리고 여기에 등장하는 Feedback이니 Impacts니 하는 정보들은 Dop 네트웍에서 Detail View를 확인해보면 찾을 수 있습니다.)
이렇게 복사된 포인트들은 set_point_position노드를 통해서 각각 충돌지점으로 옮겨집니다.
이번에는 포지션값에 dopfield("../..", "dentme", "Feedback", "Impacts", $PT, "positionx") 이런 익스프레션이 들어가있습니다.
DOP 네트웍에있는 dentme노드에서 파티클과 충돌된 지점의 포지션값을 리턴합니다. 역시 Detail View에서 dentme-Feedback-Impacts를 열어보면 positionx, positiony, positionz 값이 있는것을 확인할 수 있습니다.
3. 생성된 포인트에 메타볼 복사하기.
switch2 노드에 다음과같이 길쭉한 익스프레션이 있습니다.
dopfield("../..", stamp("../OUT", "OBJID", 0), "Feedback", "Impacts", stamp("../copy_metaballs", "copy1_pt", 2), "impulse")>0.1
충돌된 부분의 impulse값이 0.1보다 클경우는 메타볼을, 아닐경우에는 null오브젝트를 선택합니다. 이것은 결과적으로 impulse값(충돌강도로 생각함^^;)이 0.1보다 클때에만 magnet노드가 작동하도록 만들기 위한 것입니다.
4. magnet 노드로 오브젝트를 디폼하기
말그대로 magnet노드를 통해서 메타볼이 생성된 부분(즉 0.1 이상의 impulse값으로 충돌이 일어난부분)을 찌그러 트립니다.
5. 마무리
예제에서 가장 고민스러웠던 부분은 메타볼이 생성된곳에서 magnet노드가 작동을 하는데 어째서 메타볼이 사라진 이후에도 디폼된것이 사라지지 않고 계속 유지되는것인가.. 하는 부분이었는데, 고민해보다가 제 나름대로 내린 결론은 시뮬레이션이 이전프레임의 정보를 토대로 다음프레임이 계산되는 것이기 때문인것 같습니다. 해당프레임의 디폼된 데이터를 토대로 다음프레임을 계산하게 될테니까요.. 실제로 solvergeo 안에서는 메타볼이 사라질때마다 해당부위의 디폼이 사라지더군요(시뮬레이션이 아니기때문에..)
지금까지 예제파일에 사용된 노드들과 익스프레션에 대해서 저 나름대로 정리를 해봤는데, 생소한것들이 많이 있었지만 저 나름대로 몰랐던 것들을 많이 알게되었고 유익한 시간이었습니다.. 잘못된 부분이 있다면 거침없는 지적부탁 드립니다.
감사합니다 ㅎ
Houdini
Sun, 03/28/2010 - 22:05
Permalink
메타볼이 사라진 이후에도 디폼된것이 사라지지 않고 계속 유지되는것인가..
바로 이것이 Sop Solver의 핵심입니다. 스택이 쌓이는 거죠. 매 프레임 마다 오브젝트의 변형되는 부분을 계속 유지하면서 다음 프레임으로 넘겨줍니다. 핵심은 그것이고, 충돌부분을 얻어내는 거라든지, 마그넷을 이용한 디폼이라든는 추가되는 기능일뿐입니다. 정말 수고하셨네요.
Inseong
Mon, 03/29/2010 - 02:02
Permalink
음.. 정말 강력한 기능인듯..
sop 네트웍의 스택이 쌓이며 다이나믹과 연동되는것은.. 정말 신선하고 강력한 부분으로 느껴지는군요..ㅎ