헛둘이 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 이어서 공부