강체(RigidBody)의 모양(Shape)는 물체가 공간에서 차지하는 범위와, 충돌 특성을 설명한다.
모양(Shape)는 세 가지 목적으로 사용된다.
1. 교차 검사(Intersection test)
- 물체 간 접촉 기능을 결정
2. 장면 쿼리 테스트 (Scene query test)
- 예시로는 레이캐스트(raycast)
3. 트리거 볼륨 정의
- 다른 모양들이 교차할 때 알림 생성
- 각각의 Shape는 참조 카운팅되며, PxGeometry 객체와 PxMaterial의 참조를 포함한다.
- 이들은 생성 시 모두 지정되어야 함
*아래 코드는 구체 모양과 특정 재질을 가진 모양(Shape)를 생성하는 방법을 보여준다.
PxShape* shape = physics.createShape(PxSphereGeometry(1.0f), myMaterial, true);
// 마지막 인자 true는 이 shape가 다른 Actor와 공유되지 않음을 SDK에 알리는 인자
myActor.attachShape(*shape);
shape->release();
*PxRigidActorExt::createExclusiveShape() 메서드는 위 3줄과 동일한 일을 한다!
*따라서 이렇게 사용하는 게 더 간결하고 가독성이 높다.
PxShapeFlags
- 이 값은 createShape 함수에 선택적 매개변수로 지정될 수 있다.
- 2번째 인자 값으로, 기본 값은 충돌시뮬레이션에 사용되며, 씬에서 쿼리 가능하며, 디버그모드에서 시각화된다.
- 이 밖에도 여러 옵션들이 있음(파티클모드, 휘어진경계모드, 빠른관성계산모드 등)
Shape와 Geometry 객체에 대한 제한사항
PhysX에서 물리적 충돌 처리를 위한 모양(Shape)를 만들 때,
해당 모양이 가지는 공간적 범위와 충돌 속성을 기술하는 PxGeometry 객체를 지정할 수 있다.
예를 들면, PxSphereGeometry(1.0f)는 반지름이 1인 구 형태의 모양을 만들기 위한 PxGeometry 객체
만약, Shape에 Geometry 객체가 지정된다면, 해당 Geometry 객체가 Shape에 복사되어 들어간다
이 때 Geometry 객체가 지정할 수 있는 Shape의 종류는 플래그와 부모 Actor 유형에 따라 제한이 있다.
예를 들어, 동적 액터(Dynamic Actor)에 연결된 Shape에서는 Plane Geometry를 지원하지 않는다.
이와 같은 제한은 물리 엔진 내부적으로 해당 Shape와 연결된 다른 모양들과의 충돌 검사를 효율적으로 처리하기 위해 필요하다.
Dynamic Actor에 해당하는 Shape에는 Box, Sphere, Capsule등과 같은 Geometry 객체만 지정할 수 있다!
(이후에 배울 Kinematic Actor는 다른 액터에 연결된 모양도 지원된다.)
Actor에서 모양을 다음과 같이 분리할 수 있다.
myActor.detachShape(*shape);
시뮬레이션 Shape와 씬 쿼리 Shape
- Shape는 씬 쿼리 및 충돌 테스트 중 하나 또는 둘 다 참여할 수 있음
- 기본적으로 Shape는 두 가지 모두에 참여한다.
- 아래 의사 코드는 PxShape 인스턴스가 충돌 테스트에 참여하지 않도록 한다.
void disableShapeInContactTests(PxShape* shape)
{
shape->setFlag(PxShapeFlag::eSIMULATION_SHAPE,false);
}
- 아래 의사 코드는 반대로 충돌 테스트에 참여하도록 한다.
void enableShapeInContactTests(PxShape* shape)
{
shape->setFlag(PxShapeFlag::eSIMULATION_SHAPE,true);
}
Kinematic Triangle Meshes (운동학적 삼각형 메시?)
- 물리 엔진에서 삼각형 메시(예를 들면 평면) Shape를 가지는 객체에 대해 운동학적 특성을 적용하려면,
PxRigidDynamic 형식으로 생성하면 된다.
- 그러나 이 객체를 시뮬레이션중인 충돌 계산을 수행해야 하면,
아래와 같이 플래그를 설정해서 이 객체가 움직일 수 있게(Kinematic) 설정되어 있어야 한다.
*이 때, Kinematic 객체의 위치와 방향을 수동으로 조작할 수 있다!
만약, 시뮬레이션 Shape 플래그를 해제하면 더 이상 움직일 수 없다.
* 시뮬레이션 Shape 플래그란?
- isSimulationShape로 지정할 수 있는 불린값으로, createShape의 3번째 인자이다.
- 이 값은 해당 모양이 시뮬레이션의 충돌 테스트에 참여할 것인지의 여부를 결정한다.
- true로 설정하면 시뮬레이션에서 충돌 테스트에 참여하게 되고, false로 설정하면 충돌 감지에 참여하지 않는다.
아래는 운동학적 성질을 갖는 Flag를 설정하는 코드이다.
PxRigidDynamic* meshActor = getPhysics().createRigidDynamic(PxTransform(1.0f));
PxShape* meshShape;
if(meshActor)
{
meshActor->setRigidDynamicFlag(PxRigidDynamicFlag::eKINEMATIC, true);
PxTriangleMeshGeometry triGeom;
triGeom.triangleMesh = triangleMesh;
meshShape = PxRigidActorExt::createExclusiveShape(*meshActor,triGeom,
defaultMaterial);
getScene().addActor(*meshActor);
}
- Actor에서 setRigidDynamicFlag의 첫 번째 인자로 운동학적 성질 플래그가 들어가고, 두 번째 인자로 그 플래그가 세팅될 값이 들어간다.
- 아래는 운동학적 성질을 제거하는 코드이다.
PxRigidDynamic* meshActor = getPhysics().createRigidDynamic(PxTransform(1.0f));
PxShape* meshShape;
if(meshActor)
{
meshActor->setRigidDynamicFlag(PxRigidDynamicFlag::eKINEMATIC, true);
PxTriangleMeshGeometry triGeom;
triGeom.triangleMesh = triangleMesh;
meshShape = PxRigidActorExt::createExclusiveShape(*meshActor, triGeom,
defaultMaterial);
getScene().addActor(*meshActor);
PxConvexMeshGeometry convexGeom = PxConvexMeshGeometry(convexBox);
convexShape = PxRigidActorExt::createExclusiveShape(*meshActor, convexGeom,
defaultMaterial);
'PhysX > [NVIDIA] PhysX_Tutorial' 카테고리의 다른 글
7. PhysX - RigidBody Dynamics - 1 (0) | 2023.03.04 |
---|---|
6. PhysX - RigidBody 충돌 - 2 (0) | 2023.03.03 |
4. PhysX - RigidBody 개요 (0) | 2023.03.03 |
3. PhysX - Geometry (0) | 2023.03.03 |
2. PhysX API (0) | 2023.03.02 |
댓글