Skip to content
Summary (AI Generation)

후디니의 RBD 시뮬레이션에서 컨스트레인트는 두 물체를 연결하는 중요한 요소입니다. 이 문서에서는 두 상자를 연결하는 컨스트레인트의 기본 개념과 설정 방법을 다룹니다. 특히 폴리라인을 통한 컨스트레인트 구성, 포인트 레벨의 속성 설정, 그리고 Hard Constraint의 @restlength 설정과 같은 핵심 내용을 설명합니다.

Constaints and RBD 101

앞서

WARNING

옳지 않은 설명이나 보충이 필요한 설명은 저에게 연락해주시면 언제든 리비전을 적겠습니다. 해당 문서의 author 란에 함께 기재할 예정이며 문서의 하단에도 같이 기재하고 있습니다.

가정

두 상자가 놓여져 있다고 가정하고 우리는 이 상자들을 piece 0, piece 1 지오메트리라 부르겠습니다. @name="piece0" 는 pack 된 지오메트리 이기 때문에 포인트 레벨의 어트리뷰트입니다. 기억해주세요.

그리고 두 상자를 이어주는 끈이 있습니다. 이것을 Constraint 라 부르겠습니다. @constraint_name="Hard" 는 primitive 레벨에 위치합니다.

constraint 끈의 양 끝에 점들이 있겠죠? 이 두 point 들의 point attribute 인 @name을 지어줍니다.

자 이제.. 시작해볼까요?

Basics and Simulation

후디니에서는 polyline 을 통해 rigid body 의 constraints 를 구성할 수 있습니다. 이 컨스트레인트 라인의 끝에는 두개의 점이 있는데 이 점들은 geometry 이름을 point 레벨의 속성에 보관하고 있습니다.

물론 packed 된 geometry 들의 점들에도 point 레벨 속성에 같은 geometry 이름을 갖고 있습니다. 일치하지 않으면 해당 포인트는 어떤 프리미티브와 연결되어야 할지 찾을 수 없으므로 붙어있지 않겠죠?

WARNING

Hard Constraint 에는 @restlength 가 필요합니다. restlength는 두 물체의 간격을 저장하기 때문에 초기 단계에 설정이 필요합니다. 없으면 시뮬레이션 시작과 동시에 달라붙고 실제 거리보다 큰 값이 저장되면 시뮬레이션 시 늘어납니다.

재미를 위해 point wrangle을 달고 @restlength *= 5 해보세요.

예제에서는 우리는 converline SOP을 사용해 자동으로 계산할겁니다.

가정에서 구성한바와 동일하게 만들고 재생을 하면?

지오메트리의 centroid 와 constraint이 잘 붙어있음을 보여주기 위해 하나는 x-ray 처럼 보이게 하였습니다.

아주 간단하고 기본적인 constraint를 포함한 rigid body simulation이 완성되었습니다.

이름 없는 Constraint 으로 고정된 포인트 만들기

constraint 는 해당 포인트와 packed primitive의 @name 어트리뷰트가 일치해야 연결됨을 알려드렸습니다. constraint 에서 포인트를 하나 더 만들고 이름을 @name=""로 줘봅시다. 위치는 적당히 옮겨보시구요. 그렇다면'

지오메트리의 centroid 와 constraint이 잘 붙어있음을 보여주기 위해 하나는 x-ray 처럼 보이게 하였습니다.

constraint 에 null 네임을 주는것 말고 primitive 의 속성을 건드려 다르게 적용해볼 수 있습니다.

packed geometry 인것을 계속 감안해주세요. 왜냐햐면 우리는 @active 속성을 point level에 적용해야 하기 때문입니다.

vex
if(@name=="piece2")@active=0;
else @active=1;

지오메트리의 centroid 와 constraint이 잘 붙어있음을 보여주기 위해 하나는 x-ray 처럼 보이게 하였습니다.

와~ 신난다. 이제 더 많은것을 할 수 있을것 같은 느낌이 듭니다.

Constraint 의 종류

위 예제는 기본적으로 두 물체가 어떻게 연결되는지 이해시키기 위해 Hard 를 사용했지만 후디니의 Constraint 에는 여러 종류가 있습니다. 나열해보자면

Hard Constraint Glue Constraint Soft Constraint Spring Constraint

몇가지가 더 있지만 생략하겠습니다. 하나하나 알아볼까요..?

Hard Constraint

외부의 force에 깨지지 않으며 Constraint 의 @restlength 어트리뷰트, @constraint_type 지정이 반드시 필요합니다.

단단한 바벨을 떠올려봅시다.

양 끝 두 점에 @constraint_type 라는 어트리뷰트도 있어야 합니다. 따로 지정되지 않을때에는 "position" 으로 간주됩니다. 헷갈리겠지만 position이 constraint 되는 것이라 @constraint_type = "position" 따라서 rotation인 회전이 자유로워 지고 반대는 .. 뻔하죠? position이 자유로워 집니다.

아래도 분명 gif입니다

Soft Constraint

Hard constraint 에 비해서 rigid 한 느낌이 덜 한, 결국 복원력이 덜 하여 탄성이 잘 표현됩니다. Hard 와 마찬가지로 collider 의 impact나 force 로 부서지지 않습니다만 restlength 기준으로 constraint를 끊어줄 수 있습니다. Hard Constraint 의 @constraint_type을 포함하여 Stiffness, Propagation Rate, Half-Life 등의 어트리뷰트들이 있음.

Glue Constraint

부서지기 전까지는 하나의 물체처럼 움직입니다. 충분한 force가 가해질 경우 부서질 수 있게 @strength 어트리뷰트가 존재합니다.

요약

Hard ConstraintSoft ConstraintGlue Constraint
끊어질 수 있는가특별 조건을 주는 한특별 조건을 주는 한외부의 힘으로
유연한가아주 딱딱함stiffness 조절로 탄성 조절 가능끊어지지 않는 한
대표 속성s@constraint_types@constraint_type, @stiffness@strength