Articulation Body와 질량중심
STEP, OBJ, FBX, SAT
본 포스팅은 Unity Articulation Body 또는 여러 Joint (Hinge 등등)에서 회전 기준점을 CAD에서 쉽게 지정하기 위해 작성하였습니다. 가장 일반적인 질량중심을 원점으로 만드는 것을 기준으로 포스팅 하였으니, 만약 회전 축이 질량 중심과 다를 경우 해당 축을 기점으로 원점 (Origin)을 잡아주시면 됩니다.
질량중심 (Center Of Mass)를 맞춰야 하는 이유
CAD로 모델링을 하고 유니티로 넘길 때, 각 파트의 원점을 질량중심 또는 회전 축에 맞추는 것은 매우 중요합니다.
유니티에서 MoveTowards를 제외하고 Addforce 그리고 AddTorque (Relative 포함)을 할 경우, Pivot을 기준으로 물체가 움직입니다.
다음과 같이 물체의 질량 중심에 (이 하 COM) Pivot이 설정되어 있는 경우에 다음의 코드로 y축으로 회전시켜 보도록 하겠습니다.
Articulation Body & Revolute Joint (좋은 예시)
본 설명에서는 Articulation Body와 Revlotute Joint를 설정하였습니다.
Cube 오브젝트를 2개 만들고 각각 좌표를 설정 합니다. 기준이 되는 붉은색 큐브는 (0, 5, 0) 회전할 흰색 큐브는 (0,2.5,0) 으로 설정하였습니다.
Articulation Body를 사용한 경우, Hierarchy를 다음과 같이, 설정해야 합니다. 이는 로봇공학에서 사용하는 Joint 개념으로 맨 위(부모) 오브젝트가 Root가 됩니다. Red_Cube의 Articulation Body 컴포넌트를 확인해보면 다음과 같이 Root Body로 설정된 것을 확인할 수 있습니다.
White_Cube에는 Root bodyof the Articulation이 나타나지 않고, 여러 설정창이 나타납니다. 그 중 Articulation Joint Type을 Revolute로 수정합니다. (Root 물체가 움직이지 않게 Immoveable 설정 꼭 해주시길 바랍니다)
이 후 Anchor Rotation을 Z : 90으로 설정합니다. Gizmo를 확인해보면 다음과 같이 표시되는 것을 확인할 수 있습니다.
마찬가지로 중력을 받지 않게 Use Gravity를 체크해제합니다.
원 모양으로 오브젝트가 어떻게 회전될 것인지 나타납니다. 마지막으로 X Drive에 Damping 20, Target Velocity 20을 설정해주도록 하겠습니다.
Damping 그리고 Target Velocity의 상관관계는 별도로 포스팅하겠습니다.
이 후 실행시켜 보면, 잘 회전하는 것을 확인할 수 있습니다.
설정한 축의 중심에 맞게 큐브가 잘 회전합니다. 하지만 실제 CAD에서 모델링을 하고 유니티로 넘겨올 때 질량중심에 따라 예상하지 못한 결과가 발생합니다.
Articulation Body & Revolute Joint (나쁜 예시)
나쁜 예시로 모델링을 해보도록 하겠습니다.
질량중심과 원점 Origin을 다른 곳에 설정하도록 하겠습니다. 이 후 유니티로 넘겨줍니다.
1x1x1(m)로 모델링을 하였지만, 유니티는 친절하게도 CAD에서 넘길 때 모델링 기준이(mm)인 것을 알고 1000배 (m로 변환)해서 불러옵니다. 0.001배 해서 크기를 맞춰줍니다.
Inspector에서 Scale Factor를 0.001로 하면 편하게 조절할 수 있습니다.
Pivot이 완전 난장판이네요. 너무 마음에 듭니다. 마찬가지로 동일 셋팅을 하고 플레이 해보도록 하겠습니다.
원점이 달라서 오브젝트의 위치를 맞추는 것부터 불편해집니다.
제가 간단하게 모델링 해서 오브젝트의 치수를 알았기 때문에 다음과 같이 Transform을 설정할 수 있었습니다. 하지만 팀 프로젝트에서 협업을 할 시 다음과 같이 Pivot을 잘못 맞춰줄 경우, 모델링 엔지니어 또는 시뮬레이션 엔지니어 둘 중 한명이 별도의 치수를 하나하나 재야하는 소요가 발생합니다.
동일 설정을 하고 플레이 해보도록 하겠습니다. 동일하게 설정했음에도 불구하고 Pivot 기준으로 회전함으로써 기대한 것과 다른 회전을 하는 것을 확인할 수 있습니다.
다른 각도에서 다시 보도록 하겠습니다. 속도를 조절해 주고 이번에는 x 축을 기준으로 회전시키겠습니다.
차이가 확연하게 보입니다.
해결 방법
빈 오브젝트를 생성하는 방법 (비추천)
다음과 같이 옮기고 싶은 Pivot 위치에 빈 오브젝트를 생성합니다 (Create-Empty) 이 후 Pivot을 수정하고자 하는 오브젝트도 옮기고자 하는 위치에 옮겨줍니다.
이 후 수정하고자 하는 물체를 해당 빈 오브젝트의 하위 오브젝트로 넣어줍니다. (이 때, 치수를 알고 있어야 하며, 치수와 Pivot 사이의 거리를 알고 있어야함)
다음과 같이 수정이 되었습니다. 오브젝트는 Pivot을 기준으로 움직임으로 이 때 Articulation Body는 Empty Object에 생성해야합니다.
즉, 빈 오브젝트 만들기 -> 치수 구하기 -> 이동 -> Pivot이 잘못된 오브젝트 이동 메커니즘으로 해결할 수 있고, 이 경우 각 오브젝트의 치수를 알아야 하며, 치수를 안다고 하더라도 Articulation Body 또는 Rigid Body 오브젝트를 별도의 빈 오브젝트에 설정해야 함으로 상당히 번거롭고 직관적이지 않습니다.
추천 해결 방법
모델러를 혼낸다
꼭! 모델러한테 모든 Part의 원점 (회전 기준 점)을 맞춰달라고 하시길 바랍니다. 유니티든 Omniverse든 Real-Time Platform에서 치수를 재는 것은 어렵습니다. 반대로 앞서 설명한 대로 CAD 프로그램은 Mesure 그리고 COM을 측정하고 Pivot을 쉽게 옮길 수 있기 때문에 모델러에게 사전에 확실하게 모든 파트의 Pivot을 맞추는 것을 주문하시길 권장합니다.
댓글