Unity3D/Physics

Unity 3D Physics

Soul-Learner 2014. 3. 1. 16:07

유니티 3D 에서 제공하는 Physics 콤포넌트의 Physic Material, Is Kinematic, Hinge Joint 설정 및 사용


유니티 3D 에서는 기본적인 물리현상을 지원하기 위해 Physics 콤포넌트를 제공하는데 여러가지 항목 중에서 Physic Material과 Is Kinematic, Hinge Joint 에 대해서 알아본다


아래 그림처럼 Scene 뷰에 Plane, Cube, Sphere 를 이용하여 수직으로 배치하고 Plane 위에 Cube가 올려져 있고 Sphere 는 공중에서 Cube를 향하여 낙하할 준비가 된 상태이다




위의 상태에서 Play 모드로 테스트해보면 구가 떨어지면서 Cube 위에서 충돌하고 그대로 멈추는 것을 확인할 수 있다. 만약 떨어지는 Sphere 가 축구공이었다면 충돌 후에 다시 튀어 올라왔을 것이다. 이러한 효과는 물리재질(Physic Material)을 설정해 주면 가능해진다


Inspector 뷰에서 Collider 섹션을 보면 Material 항목이 있는데 현재 여기는 Physic Material 이 None 으로 설정되어 있다. 즉, 물리재질이 설정되지 않았기 때문에 충돌하면서 아무런 효과도 볼 수 없었다는 의미이다. Material 항목의 우측에 조그맣고 동그란 아이콘을 누르면 Physic Material 을 설정할 수 있는 창이 열리지만 선택할 수 있는 물리재질 항목이 아무것도 없는 상태이다




물리재질(Physic Material)을 설정하기 위해서는 먼저 Physic Material 패키지를 임포트해 주어야 한다






위와 같이 물리재질 패키지를 임포트한 후에 다시 Physic Material 설정버튼을 누르고 테스트를 위해 다음과 같이 Bouncy 로 재질을 설정해준다.



위와 같이 물리재질을 설정한 후에 Play 모드에서 확인해 보면 공이 큐브에 충돌하고 튀어 오르는 것을 확인할 수 있다. 그런데 시간이 갈수록 점차 높이 튀어 오르고 있는데 이는 Rigidbody 콤포넌트의 Drag(저항, 마찰) 가 0 으로 설정되어 있기 때문이며 Drag 수치를 올려서 마찰을 증가시키면 점차 튀어 오르는 높이가 낮아지다가 결국 아래의 그림처럼 큐브위에 멈추게 될 것이다




다음은 Rigidbody 콤포넌트의 Is Kinematic 항목에 대해서 알아본다

결론부터 말하자면 Is Kinematic 항목에 체크하고 Play 모드에서 확인해 보면 해당 오브젝트는 더 이상 물리학이 적용되지 않는다는 것이다. Collider 가 설정된 오브젝트라면 충돌은 감지하지만 공중에 떠 있는 구가 떨어지지 않게 되고 충격을 받은 물체는 충돌을 감지는 하지만 충돌에 반응하지는 않는다.

즉, Is Kinematic 항목을 체크한 오브젝트는 외부의 물리학적 영향에 대한 반응을 계산하지 않으며 오로지 오브젝트의 Transform 에 의해서만 변화한다는 것이다.


Unity 3D Docs 참조 http://docs.unity3d.com/Documentation/Components/class-Rigidbody.html

Is Kinematic

If enabled, the object will not be driven by the physics engine, and can only be manipulated by its Transform. This is useful for moving platforms or if you want to animate a Rigidbody that has a HingeJoint attached.


지속적으로 움직이거나 모양이 변화되는 오브젝트가 있다면 그 때마다 물리엔진이 그 오브젝트의 물리학적 계산을 수행해야 하므로 전체적인 성능에 영향을 미치게 되고 물리학적 반응이 중요시되지 않는 오브젝트라면 Is Kinematic 항목을 체크해서 시스템의 부하를 경감시킬 수 있을 것이다.


Google 에서 'What is Kinematic' 으로 검색하면 다음과 같은 정의를 찾을 수 있다.

the branch of mechanics concerned with motion without reference to force or mass


위의 정의를 유니티 3D의 Is Kinematic 개념에 적용해서 나름대로 다음과 같이 유추해 보았다


[ 가해진 힘을 고려하지 않고 움직이는 오브젝트인가? 


[외부에서 가해진 힘과 무관하게 움직이는 오브젝트인가? ]


[외부에서 가해진 힘에는 영향을 받지 않고 자체적으로 움직이는 오브젝트인가? ]


아래의 테스트는 공중에 떠 있는 구가 있고 구의 Is Kinematic 항목에 체크가 되어 있는 상태에서 Play 모드로 확인해 보면 다음과 같이 구가 중력의 영향을 받지 않아서 낙하하지 않는 것을 확인할 수 있다





이번에는 Physics 콤포넌트 중에서 Hinge Joint 라는 것을 테스트해 보려고 한다.


아래의 그림과 같이 Scene 뷰에 큐브 하나를 생성하고 두께를 납작하게 해서 바닥에 닿지 않는 높이에 올린다




Hierarchy 뷰에서 Cube를 더블클릭하여 Cube가 Scene 뷰의 중심에 정렬되도록 하고.생성된 큐의 Pivot 중심을 한쪽 끝에 오도록 설정하기 위해 Empty Object 한개를 추가하고 Empty Object 의 위치를 큐의 한쪽 끝으로 이동한 후에 Empty Object 의 이름을 HingeParent 로 변경한다.



Hierarchy 뷰에서 Cube를 드래그하여 HingeParent 안드로 이동하여 그룹을 이루도록 한다. 이 때 HingeParent 의 중심위치가 생성된 그룹의 전체 중심위치로 변경되는데, 툴바에서 Center 버튼을 눌러서 Pivot 으로 변경하면 원래의 Empty Object의 위치로 되돌아간다.


참고: 유니티에서는 계층구조를 이루는 오브젝트들의 경우에 자식 오브젝트에 별도의 Rigidbody를 설정하지 않도록 하고 있으므로 차후에 Rigidbody를 적용한 오브젝트가 다른 오브젝트의 자식으로 포함되는 경우가 발생하지 않도록 주의해야 한다



위의 상태에서 Play 모드로 테스트해 보면 큐브가 바닥으로 떨어지지 않는다. 왜냐면 중력을 적용하지 않은 상태이기 때문이다.

Hierarchy 뷰에서 HingeParent 를 선택하고 Component > Physics > Rigidbody 항목을 선택하여 중력을 적용하고 다시 Play 모드로 테스트한다

테스트 결과 큐브가 그대로 떨어져 버리면 지금까지는 성공인 셈이다. 


HingeParent의 Pivot 중심에 Hinge Joint 를 설정해주면 공중에 있더라도 Hinge Joint 로 지정된 축은 공중에 고정되어 있기 때문에 축이 아닌 다른 쪽은 힌지 축에 매달려 흔들거리는 상태가 될 것이다


다음과 같이 HingeParent의 X 축에 Hinge Joint 를 설정한다




Inspector 뷰에서 Hinge Joint 콤포넌트를 확인하여 원하는 축이 힌지축으로 설정되어 있는지 확인한다. 아래 그림은 HingeParent의 X축이 힌지축으로 설정된 것을 나타낸다


Hinge Joint 설정이 모두 끝났으므로 Play 모드로 테스트해 보면 큐브가 공중에서 떨어지지 않고 힌지축에 매달려 흔들거리는 상태가 되는 것을 확인할 수 있다.

힌지 운동이 빨리 멈추기를 바란다면 Rigidbody 콤포넌트의 Drag 항목에서 수치를 올려주면 된다. Drag 수치가 0 으로 설정되어 있어도 힌지 운동은 점점 약해져서 결국 멈추게 된다. 힌지 운동이 지속적으로 되도록 하려면 Constant Force 콤포넌트를 적용해야 한다



만약 위의 상태에서 Inspector 뷰의 Is Kinematic 항목을 체크하고 Play 모드로 테스트하면 어떻게 될까?  위에서 적용한 힌지 운동은 중력의 작용이므로 외부의 힘에 영향을 받지 않고 자체적으로 운동한다는 설정을 하면 당연히 중력에 의한 힌지 운동이 발생하지 않게 된다.


힌지 운동이 지속적으로 일어나도록 Constant Force 콤포넌트를 설정하는 절차를 알아본다




Inspector 뷰의 Constant Force 콤포넌트에 힘의 방향과 세기를 설정한다 

아래의 그림은 -Z축 방향으로 작용하는 힘을 설정함 (Z축 방향으로부터 작용하는 힘 )


힘의 세기를 높여주면 그 효과가 더 크게 표현된다.


위의 그림에서 Inspector 뷰의 Constant Force 콤포넌트 항목 중에서 Torque는 회전력을 의미한다. 즉, 오브젝트가 회전하도록 설정하려면 스크립트를 이용하여 transform.Rotate() 함수를 사용해도 되고 변함없이 일정한 회전력을 표현하려면 Constant Force 콤포넌트의 Torque 항목을 이용해도 된다는 것을 알 수 있다. 그런데 유니티 문서에는 transform과 Constant Force 를 이용하여 동시에 변환을 할 수 없도록 규정하고 있기 때문에 스크립트를 이용하여 회전을 적용하고 있다면 먼저 그 스크립트를 제거한 후에 Constant Force를 이용해야 할 것이다.