테드옹의 VFX
Houdini Vellum 정리 본문
-정리 & 팩트체크 전혀 안된 상태 -
[들어가기 전에]
- xPBD : Extended Position Based Dynamic
- FEM은 더 현실세계에 맞는 수치를 가지고 있지만, vellum은 FEM보다 빠르고 여러가지의 Constraints type을 가질 수 있다
- Vellum에선 정말 Stiff한 물체는 만들기 힘들다(Metal bending같은). 따라서 이런 건 Bullet의 Soft Constraints로 해결해야한다
- Continuous Collision Detection을 사용한다
- Match Topology노드를 활용해야할 수도 있음
- Pscale은 되도록 높게 유지하되, Edge Length보다 크면 안됨(Self-Collision 방지)
- 적당한 Constraint Iteration이 없다면, 원래 형태로 돌아가지 못할 수도 있다. Substep을 늘려도 도움이 되지만 Constraints Iteration을 늘리는 것이 연산에 더 빠르다
간단히 정리해서, Constraint의 특징(stiffness, damping etc.)을 달성하며 rest 상태로 돌려놓는게 PBD의 핵심이다
[1st Order vs. 2nd Order]
수치적분(Numerical Intergration)의 공통적인 목표
- 현재 v를 이용해 P를 업데이트한다(explicit)
- Constraints와 Collision을 solve하여 P를 업데이트한다
(Stiffness, Plasticity 등을 만족할 때까지 constraint iteration을 진행)
- dP를 통해 Velocity를 업데이트한다(implicit)
- 보통은 오일러 적분(@P += @v * deltaT)을 통해서 시뮬레이션을 하지만, Verlet Intergration의 방법 또한 존재한다. (v@P += (@P - oldP) + accel * deltaT^2)
1st Order
- Linear step
- 보통 Constrained Particle들은 선형적으로 움직이지 않는데, 1st Order를 사용하면 부정확함이 생기고 그곳에서 Enery loss가 일어난다. 이것을 해결하기 위해서 substep을 늘려야하는데 시간이 더 오래걸림
- 즉, Constraints가 정상적으로 정렬(Coverage)될 때까지 많은 Iteration이 필요하다.
2nd Order
- Energey를 더 잘 보존함
- Non-Linear 다이나믹에 적합하다
- 데이터가 더 필요하다(vlast, plast...)
- 콜리전시 Bouncing이 있을 수 있다. (이 경우, 디폴트 값의 경우 1st Order로 Fallback한다)
[PBD vs. xPBD]
기존 PBD알고리즘은 Substep과 Constraints Iteration이 늘어나면 Stiffness가 무한으로 발산하는 경우가 있었지만, xPBD의 경우엔 그런 단점을 보안한 알고리즘이다.


Vellum의 종류
- Cloth
- Hair
- Softbody(Strut, Tetrahedral, Balloon)
- Grains
- Pins/ Stitch/ Attach to Geometry
[Vellum은 iterative solver이다]
- 반복을 거듭하면서 Constraint의 에러 값을 줄여나가며 모션을 더 정확게 함
- 만약 반복이 적다면 스트레칭이 과하게 되거나 stiff한 모션이 나올 수 있다.
- Constraint Iterations, Collision Iterations, Smoothing Iterations
Smoothing iteration은 불가능한 시나리오(포지션이 고정된 constraint의 restlength를 강제로 x0.5배 해버리는 등..)의 constraints의 에러를 최대한 smoothing하는 것이다(Jacobi vs. Gauss-Seidel)
(*Jacobi는 모든 constraints를 solve한 후에 P업데이트를 진행하고, 반면 Gauss-Seidel은 하나의 Constraints를 solve할 때마다 즉시 P업데이트를 한다. 전자는 병렬로 진행이 가능하다는 특징이 있음)
Vellum Object(Geometry Data + ConstraintGeometry Data)
- Hard Pin 혹은 weld는, solver에게 발견되면 Constraints를 solver하는게 아니라 바로(Directly)포지션 업데이트를 한다. (파티클 어트리뷰트, $OBJID/Geometry Data), Auto-breakable이다.
- Soft pin 혹은 Stitch는, Constraints를 solve하여 포지션 업데이트를 한다(프리미티브 어트리뷰트, $OBJID/ConstraintGeometry Data)
- Pin type Permenat와 Stopped는 Hard Constraint이다.
- mass가 0이면 Infinite이란 의미 (이런 케이스엔, constraints가 Geometry 데이터의 파티클 P를 업데이트하지 못한다)
(**질량이 무한대인 물체는 물리적인 힘에 의해 움직이지 못하기 때문에, solver에 의해서 움직여지는게 아니라 animation에 따라서 움직여져야한다)
[Vellum Softbody]
Tetraheral Softbody(Distance Along Edges + Tetraheral Volume)
- Tet Softbody는 Distance Constraints와 Volume Constraints로 나눈다
Distance Constraints는 edge를 스프링처럼 만들어서 오브젝트의 전반적인 Shape을 유지하고, Volume Constraints는 각 tetrahedron의 볼륨을 유지하여 local volume preservation을 달성한다
- Tet Softbody는 인풋 지오메트리를 remeh, tet conform하여 새로운 지오메트리를 생성한 후, 시뮬레이션이 끝나면 원본 지오메트리를 point deform하는 방식이다
- Plasticity와 엮으면 밀대에 밀리는 밀가루 반죽등을 시뮬레이션하기 좋다
- 프록시 지오메트리가 너무 Low Resolution이면 Remesh의 Target size를 조금 낮춰주면 좋다
Strut Softbody(Cloth + Struts)
- 랜덤한 Strut을 형성하여 안과밖을 '이쑤시개(toothpick)'처럼 유지한다, 그래서 뾰족한 artifact들이 생길 수 있다 (굉장히 보기 안좋음..)
- Tet softbdy와는 다르게 원본 지오메트리를 사용하여 시뮬레이션한다 (Strut도 사실 remesh를 통해 일정한 subdivision을 가진 프록시를 만들어서 시뮬레이션한 후 point deform을 시키는게 더 낫다)
Strut는 다소 Rigid한 물체에 적합하고, Tetrahedral은 유기체적인 움직임에 더 적합하다(카더라)
[Constraints의 종류]
1. Stich & Slide
2. Plasticity
- 소성(Plasticity)는 힘을 받은 물체가 변형할 때, 특정 임계점을 넘어서 영구적으로 형태가 변하는 특성을 뜻한다.
- 캐릭터가 밟고 지나간 Grass들에 적합
3. Triangle & Tetrahedral Strectch Constraints
- ARAP(As Rigid As Possible)
- Preserve Volume옵션을 키면 추가적으로 더욱 볼륨을 유지시켜준다
4. Pressure
5. Dynamic
----------------------나중에 다시 정리 후디니 어트리뷰트 타입
A. distance
B. bend
C. pressure
D. angle
E. bendtwist
F. branchstitch
G. stitch (glue) -> connectivity
H. shapematch
[Substeps & Constraint Iterations & Collision Pass]
- 빠르게 움직이는 물체를 solve하려면 Substep이 필요하지만, 적은 substep은 보통 더 나은 collision bound를 보여준다
- Constraint Iteration은 strectch와 bend를 가능하게 해준다. Stiff하고 non-stretching하고 non-bending하는 오브젝트를 시뮬레이션 하고 싶으면 Constraint Iteration을 늘려야한다. (안그러면 Constraint가 rest로 정렬되기전에 시뮬레이션이 끝날테니 부정확한 모션이 생김) 그리고 Constraint Iteration은 생각보다 연산이 빠르다
- Collision pass는 외부와 self collision을 둘 다 계산한다.
- Post Collision pass는 모든 계산이 끝나고 한번 더 하는 개념이다. Constraints와 연계되지 않으며 제대로 해결되지 않은 충돌을 마지막으로 풀기 위한 수단이다.
[풀리지 않은 의문점]
1. 그래서 Solver 어디에서 포지션 업데이트, 벨로시티 업데이트를 하냐
2. Mass와 Pscale은 언제, 어떻게, 왜 쓰이냐
Vellum Attributes : https://www.sidefx.com/docs/houdini/vellum/vellumattributes.html
Vellum attributes
There are many types of constraints, so the meaning of these variables is often dependent on the constraint type. They usually live on the primitive. Dynamics: parameters Type Name Description float dampingratio (Prim) 0..1 damping ratio. Note Higher than
www.sidefx.com

위의 내용으로 해석한 Vellum Solver 내부의 대략적인 도식
'Houdini' 카테고리의 다른 글
Space Transformation (1) | 2023.10.05 |
---|---|
Guide Deform Wrangle (0) | 2023.09.09 |
Gnomon workshop - Lookdev in Arnold Houdini (0) | 2023.07.30 |
PDG 정리 (0) | 2023.05.22 |
파이썬 코드로 플립북 mp4 생성 (0) | 2023.05.15 |