게임 개발/[D2D_Portfolio] DirectX2D 포트폴리오 작업일지
8. Collision Notification 구현
헛둘이
2023. 3. 21. 16:20
충돌 통지 기능 구현
- PhysX 4.1버전은 물체 간의 충돌이 일어났을 때 필터 쉐이더를 통해 어떻게 처리할 지를 구분한다.
- 필터 쉐이더는 함수이며, 씬이 생성될 때 등록할 수 있다.
- 필터는 Shape 객체가 가지고 있는 FilterData를 의미하고, 충돌이 일어나면 이 데이터의 word0, word1 멤버를 토대로 조사하게 된다.
- word0은 자신의 레이어이고, word1은 충돌할 레이어인데, word1은 비트마스크로 되어 있어서 여러 그룹과의 충돌을 지정할 수 있다.
// 두 필터가 서로 충돌플래그가 세워져 있을 경우
if ((filterData0.word0 & filterData1.word1) || (filterData1.word0 & filterData0.word1))
{
pairFlags |= PxPairFlag::eNOTIFY_TOUCH_FOUND;
return PxFilterFlag::eDEFAULT;
}
- 이런 식으로 충돌에 대한 조건식을 세울 수 있다.
- PxFilterFlag::eDEFAULT를 반환하게 되면, SimulationCallback 클래스의 onContact 함수가 호출된다.
- 각 Collider는 이 클래스를 들고 있어서, Collider 안에서 적절한 처리를 해줄 수 있다.
class ContactCallback
: public PxSimulationEventCallback
{
public:
virtual void onContact(const PxContactPairHeader& pairHeader, const PxContactPair* pairs, PxU32 nbPairs) override;
virtual void onConstraintBreak(PxConstraintInfo* constraints, PxU32 count) override {}
virtual void onWake(PxActor** actors, PxU32 count) override {}
virtual void onSleep(PxActor** actors, PxU32 count) override {}
virtual void onTrigger(PxTriggerPair* pairs, PxU32 count) override {}
virtual void onAdvance(const PxRigidBody* const* bodyBuffer, const PxTransform* poseBuffer, const PxU32 count) override {}
};
- 보통 이렇게 상속받아서 구현이 되며, 상속받은 함수의 onContact를 구현해서 적절한 처리를 수행한다.
내일 할 일
- onContact 함수 내에서 pair안 각각의 객체 식별 및 간략한 처리 내용 구현
- PhysX 4.1 SDK 참고해서 Scene Query 이어서 공부