본문 바로가기
Bullet Physics

Rigid Body Dynamics

by ses jeon 2020. 12. 2.

Introduction

The rigid body dynamics is implemented on top of the collision detection module. It adds forces,

mass, inertia, velocity and constraints.

   • btRigidBody is used to simulate single 6-degree of freedom moving objects. btRigidBody is derived from btCollisionObject, so it inherits its world transform, friction and restitution and adds linear and angular velocity.

   • btRigidBody는 단일 6 자유도 움직이는 물체를 시뮬레이션하는 데 사용됩니다. btRigidBody는 btCollisionObject에서 파생되므로 세계 변환, 마찰 및 복원을 상속하고 선형 및 각 속도를 추가합니다. 

   • btTypedConstraint is the base class for rigid body constraints, including btHingeConstraint,

btPoint2PointConstraint, btConeTwistConstraint, btSliderConstraint and btGeneric6DOFconstraint.

   • btTypedConstraint는 btHingeConstraint, btPoint2PointConstraint, btConeTwistConstraint, btSliderConstraint 및 btGeneric6DOFconstraint를 비롯한 강체 제약 조건의 기본 클래스입니다.

   • btDiscreteDynamicsWorld is UserCollisionAlgorithm btCollisionWorld, and is a container for rigid bodies and constraints. It provides the stepSimulation to proceed.

   • btDiscreteDynamicsWorld는 UserCollisionAlgorithm btCollisionWorld이며 강체 및 제약 조건에 대한 컨테이너입니다. 진행할 stepSimulation을 제공합니다.

   • btMultiBody is an alternative representation of a rigid body hierarchy using generalized (or reduced) coordinates, using the articulated body algorithm, as discussed by Roy Featherstone. The tree hierarchy starts with a fixed or floating base and child bodies, also called links, are connected by joints: 1-DOF revolute joint (similar to the btHingeConstraint for btRigidBody), 1-DOF prismatic joint (similar to btSliderConstraint) 

   • btMultiBody는 Roy Featherstone이 논의한 바와 같이 관절 형 바디 알고리즘을 사용하여 일반화 된 (또는 축소 된) 좌표를 사용하는 강체 계층 구조의 대체 표현입니다. 트리 계층 구조는 고정 또는 부동베이스로 시작하고 링크라고도하는 하위 바디는 관절로 연결됩니다. 1-DOF 회전 관절 (btRigidBody의 btHingeConstraint와 유사), 1-DOF 프리즘 관절 (btSliderConstraint와 유사)

 

Note that btMultiBody is introduced in the Bullet Physics SDK fairly recently, and is still work-in-progress. In this document, only the maximal coordinates based btRigidBody and btTypedConstraints is discussed. In a future revision, a chapter about btMultiBody will be added. For now, if you are interested in btMultiBody, please see the example browser and its source code in examples/MultiBody and examples/ImportURDF.

btMultiBody는 최근에 Bullet Physics SDK에 도입되었으며 아직 작업 중입니다. 이 문서에서는 btRigidBody 및 btTypedConstraints 기반의 최대 좌표 만 설명합니다. 향후 개정에서는 btMultiBody에 대한 장이 추가 될 것입니다. 지금은 btMultiBody에 관심이 있으시면 examples / MultiBody 및 examples / ImportURDF에서 예제 브라우저와 해당 소스 코드를 참조하십시오.

 

Static, Dynamic and Kinematic Rigid Bodies

There are 3 different types of objects in Bullet:  

   • Dynamic (moving) rigidbodies  

      !  positive mass  

      !  every simulation frame the dynamics will update its world transform  

   • Static rigidbodies  

      !  zero mass

      !  cannot move but just collide  

   •  Kinematic rigidbodies  

      !  zero mass  

      !  can be animated by the user, but there will be only one-way interaction: dynamic objects will be pushed away but there is no influence from dynamics objects 사용자가 애니메이션 할 수 있지만 단방향 상호 작용 만 있습니다. 동적 개체는 밀려나지만 역학 개체의 영향은 없습니다.

 

All of them need to be added to the dynamics world. The rigid body can be assigned a collision shape. This shape can be used to calculate the distribution of mass, also called inertia tensor. 

그들 모두는 역학 세계에 추가되어야합니다. 강체에 충돌 모양을 할당 할 수 있습니다. 이 모양은 관성 텐서라고도하는 질량 분포를 계산하는 데 사용할 수 있습니다.

 

Center of mass World Transform

The world transform of a rigid body is in Bullet always equal to its center of mass, and its basis also defines its local frame for inertia. The local inertia tensor depends on the shape, and the btCollisionShape class provides a method to calculate the local inertia, given a mass. 

강체의 세계 변환은 Bullet에 항상 질량 중심과 동일하며 그 기반은 관성에 대한 로컬 프레임도 정의합니다. 국소 관성 텐서는 모양에 따라 달라지며 btCollisionShape 클래스는 질량이 주어지면 국소 관성을 계산하는 방법을 제공합니다.

 

This world transform has to be a rigid body transform, which means it should contain no scaling, shear etc. If you want an object to be scaled, you can scale the collision shape.  Other transformation, such as shear, can be applied (baked) into the vertices of a triangle mesh if necessary. 

이 월드 트랜스 폼은 강체 트랜스 폼이어야합니다. 즉, 스케일링, 전단 등이 없어야합니다. 오브젝트의 스케일을 조절하려면 충돌 모양의 스케일을 조절할 수 있습니다. 필요한 경우 전단과 같은 다른 변환을 삼각형 메시의 정점에 적용 (적용) 할 수 있습니다.

 

In case the collision shape is not aligned with the center of mass transform, it can be shifted to match. For this, you can use a btCompoundShape, and use the child transform to shift the child collision shape.

충돌 모양이 질량 변환의 중심과 정렬되지 않은 경우 일치하도록 이동할 수 있습니다. 이를 위해 btCompoundShape를 사용하고 자식 변환을 사용하여 자식 충돌 모양을 이동할 수 있습니다.

 

What's a MotionState?

MotionStates are a way for Bullet to do all the hard work for you getting the world transform of objects being simulated into the rendering part of your program. 

In most situations, your game loop would iterate through all the objects you're simulating before each frame rander. For each object, you would update the position of the render object from the physics body. Bullet uses something called MotionStates to save you this effort. 

There are multiple other benefits of MotionStates: 

MotionStates는 Bullet이 시뮬레이션되는 객체의 세계 변형을 프로그램의 렌더링 부분으로 가져 오는 모든 노력을 수행하는 방법입니다. 대부분의 상황에서 게임 루프는 각 프레임 랜더 전에 시뮬레이션하는 모든 오브젝트를 반복합니다. 각 오브젝트에 대해 물리 몸체에서 렌더링 오브젝트의 위치를 업데이트합니다. Bullet은 이러한 노력을 줄이기 위해 MotionStates라는 것을 사용합니다. MotionState의 다른 여러 이점이 있습니다.

   • Computation involved in moving bodies around is only done for bodies that have moved; no point updating the position of a render object every frame if it isn't moving.

   • 움직이는 물체와 관련된 계산은 움직이는 물체에 대해서만 수행됩니다. 움직이지 않는 경우 매 프레임마다 렌더링 개체의 위치를 업데이트 할 필요가 없습니다.

   • You don't just have to do render stuff in them. They could be effective for notifying network code that a body has moved and needs to be updated across the network.

   • 렌더링 작업 만 수행 할 필요가 없습니다. 시체가 이동했으며 네트워크를 통해 업데이트되어야 함을 네트워크 코드에 알리는 데 효과적 일 수 있습니다.

   • Interpolation is usually only meaningful in the context of something visible on-screen. Bullet manages body interpolation through MotionStates.

   • 보간은 일반적으로 화면에 보이는 상황에서만 의미가 있습니다. Bullet은 MotionStates를 통해 신체 보간을 관리합니다.

   • You can keep track of a shift between graphics object and center of mass transform.

   • They're easy

 

Interpolation

Bullet knows how to interpolate body movement for you. As mentioned, implemention of interpolation is handled through MotionStates. If you attempt to ask a body for its position through btCollisionObject::getWorldTransform or btRigidBody::getCenterOfMassTransform, it will return the position at the end of the last physics tick. That's useful for many things, but for rendering you will want some interpolation. Bullet interpolates the transform of the body before passing the value to setWorldTransform. If you want the non-interpolated position of a body [which will be the position as it was calculated at the end of the last physics tick], use btRigidBody::getWorldTransform() and query the body directly. 

Bullet은 신체 움직임을 보간하는 방법을 알고 있습니다. 언급했듯이 보간 구현은 MotionStates를 통해 처리됩니다. btCollisionObject :: getWorldTransform 또는 btRigidBody :: getCenterOfMassTransform을 통해 바디의 위치를 요청하려고하면 마지막 물리 틱이 끝날 때 위치를 반환합니다. 이는 많은 일에 유용하지만 렌더링을 위해서는 보간이 필요합니다. Bullet은 값을 setWorldTransform에 전달하기 전에 본문의 변환을 보간합니다. 보간되지 않은 몸체의 위치 [마지막 물리 틱의 끝에서 계산 된 위치]를 원하면 btRigidBody :: getWorldTransform ()을 사용하고 몸체를 직접 쿼리합니다.

 

So how do I use one?

MotionStates are used in two places in Bullet. The first is when the body is first created. Bullet grabs the initial position of the body from the motionstate when the body enters the simulation Bullet calls getWorldTransform with a reference to the variable it wants you to fill with transform information Bullet also calls getWorldTransform on kinematic bodies. Please see the section below After the first update, during simulation Bullet will call the motion state for a body to move that body around Bullet calls setWorldTransform with the transform of the body, for you to update your object appropriately To implement one, simply inherit btMotionState and override getWorldTransform and setWorldTransform.

MotionStates는 Bullet의 두 위치에서 사용됩니다. 첫 번째는 몸이 처음 만들어 질 때입니다. Bullet은 몸체가 시뮬레이션에 들어갈 때 모션 상태에서 몸체의 초기 위치를 가져옵니다. Bullet은 변환 정보로 채울 변수에 대한 참조를 사용하여 getWorldTransform을 호출합니다. Bullet은 운동학 몸체에서도 getWorldTransform을 호출합니다. 아래 섹션을 참조하십시오. 첫 번째 업데이트 후, 시뮬레이션 중에 Bullet은 몸체의 모션 상태를 호출하여 Bullet 주위로 몸체를 움직일 것입니다 .Blet은 몸체의 변형으로 setWorldTransform을 호출합니다. 오브젝트를 적절하게 업데이트하려면이를 구현하려면 btMotionState를 상속하면됩니다. getWorldTransform 및 setWorldTransform을 재정의합니다.

 

DefaultMotionState

Although recommended, it is not necessary to derive your own motionstate from btMotionState interface. Bullet provides a default motionstate that you can use for this. Simply construct it with the default transform of your body: 

권장되지만 btMotionState 인터페이스에서 고유 한 동작 상태를 파생 할 필요는 없습니다. Bullet은이를 위해 사용할 수있는 기본 동작 상태를 제공합니다. 신체의 기본 변환으로 간단히 구성하십시오.
   btDefaultMotionState* ms =new btDefaultMotionState(); 
There is an example for an Ogre3D Motion State in an Appendix.

 

Kinematic Bodies

If you plan to animate or move static objects, you should flag them as kinematic. Also disable the sleeping/deactivation for them during the animation. This means Bullet dynamics world will get the new worldtransform from the btMotionState every simulation frame.  +

정적 오브젝트를 애니메이션하거나 이동하려는 경우 운동 학적으로 플래그를 지정해야합니다. 또한 애니메이션 중에 잠자기 / 비활성화를 비활성화하십시오. 즉, Bullet 역학 세계는 모든 시뮬레이션 프레임에서 btMotionState에서 새로운 세계 변형을 가져옵니다.
   body->setCollisionFlags( body->getCollisionFlags() | btCollisionObject::CF_KINEMATIC_OBJECT);  

   body->setActivationState(DISABLE_DEACTIVATION); 
If you are using kinematic bodies, then getWorldTransform is called every simulation step. This means that your kinematic body's motionstate should have a mechanism to push the current position of the kinematic body into the motionstate.

운동학 바디를 사용하는 경우 모든 시뮬레이션 단계에서 getWorldTransform이 호출됩니다. 즉, 운동학 바디의 모션 상태에는 운동학 바디의 현재 위치를 모션 상태로 푸시하는 메커니즘이 있어야합니다.

 

Simulation frames and interpolation frames

By default, Bullet physics simulation runs at an internal fixed framerate of 60 Hertz (0.01666). The game or application might have a different or even variable framerate. To decouple the application framerate from the simulation framerate, an automatic interpolation method is built into stepSimulation: when the application delta time, is smaller then the internal fixed timestep, Bullet will interpolate the world transform, and send the interpolated worldtransform to the btMotionState, without performing physics simulation. If the application timestep is larger then 60 hertz, more then 1 simulation step can be performed during each ‘stepSimulation’ call. The user can limit the maximum number of simulation steps by passing a maximum value as second argument. 

기본적으로 Bullet 물리 시뮬레이션은 60Hz (0.01666)의 내부 고정 프레임 속도로 실행됩니다. 게임 또는 응용 프로그램은 프레임 속도가 다르거 나 가변적 일 수 있습니다. 응용 프로그램 프레임 속도를 시뮬레이션 프레임 속도에서 분리하기 위해 자동 보간 방법이 stepSimulation에 내장되어 있습니다. 물리 시뮬레이션을 수행합니다. 애플리케이션 타임 스텝이 60 헤르츠보다 크면 각 'stepSimulation'호출 중에 1 개 이상의 시뮬레이션 단계를 수행 할 수 있습니다. 사용자는 최대 값을 두 번째 인수로 전달하여 시뮬레이션 단계의 최대 수를 제한 할 수 있습니다.

 

When rigidbodies are created, they will retrieve the initial worldtransform from the btMotionState, using btMotionState::getWorldTransform. When the simulation is running, using stepSimulation, the new worldtransform is updated for active rigidbodies using the btMotionState::setWorldTransform. 

강체가 생성되면 btMotionState :: getWorldTransform을 사용하여 btMotionState에서 초기 세계 변환을 검색합니다. 시뮬레이션이 실행 중일 때 stepSimulation을 사용하여 btMotionState :: setWorldTransform을 사용하여 활성 강체에 대해 새로운 세계 변환이 업데이트됩니다.

 

Dynamic rigidbodies have a positive mass, and their motion is determined by the simulation. Static and kinematic rigidbodies have zero mass. Static objects should never be moved by the user.  

동적 강체는 양의 질량을 가지며 해당 모션은 시뮬레이션에 의해 결정됩니다. 정적 및 운동 학적 강체는 질량이 0입니다. 정적 개체는 사용자가 이동해서는 안됩니다.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

'Bullet Physics' 카테고리의 다른 글

Actions: Vehicles & Character Controller  (0) 2020.12.03
Constraints  (0) 2020.12.03
Collision Filtering (selective collisions)  (0) 2020.12.02
Bullet Collision Detection  (0) 2020.12.02
Basic Data Types and Math Library  (0) 2020.12.02

댓글