⚖️ 성능을 중시하면 AABB, 정확도를 원하면 OBB!
BaseCollider 상속한 AABBBoxCollider, OBBBoxCollider 만들기폴더 위치: Engine/04. Component/Collision
// AABBBoxCollider.h
class AABBBoxCollider : public BaseCollider {
public:
AABBBoxCollider();
virtual ~AABBBoxCollider();
virtual void Update() override;
virtual bool Intersects(Ray& ray, OUT float& distance) override;
virtual bool Intersects(shared_ptr<BaseCollider>& other) override;
BoundingBox& GetBoundingBox() { return _boundingBox; }
private:
BoundingBox _boundingBox;
};
// OBBBoxCollider.h
class OBBBoxCollider : public BaseCollider {
public:
OBBBoxCollider();
virtual ~OBBBoxCollider();
virtual void Update() override;
virtual bool Intersects(Ray& ray, OUT float& distance) override;
virtual bool Intersects(shared_ptr<BaseCollider>& other) override;
BoundingOrientedBox& GetBoundingBox() { return _boundingBox; }
private:
BoundingOrientedBox _boundingBox;
};
auto collider = make_shared<AABBBoxCollider>();
collider->GetBoundingBox().Extents = Vec3(0.5f);
obj->AddComponent(collider);
Extents는 크기 설정.Vec3(0.5f)이면 큐브는 1x1x1 사이즈.OBB인 경우에는 Orientation도 설정 필요:
collider->GetBoundingBox().Orientation = Quaternion::CreateFromYawPitchRoll(45, 0, 0);
class MoveScript : public MonoBehaviour {
public:
virtual void Update() override {
auto pos = GetTransform()->GetPosition();
pos.x -= DT * 1.0f;
GetTransform()->SetPosition(pos);
}
};
Sphere에 붙여서 왼쪽으로 이동하게 만들고, 고정된 Cube와 충돌 유도.Intersects(shared_ptr<BaseCollider>& other) 오버라이드bool AABBBoxCollider::Intersects(shared_ptr<BaseCollider>& other) {
switch (other->GetColliderType()) {
case ColliderType::Sphere:
return _boundingBox.Intersects(dynamic_pointer_cast<SphereCollider>(other)->GetBoundingSphere());
case ColliderType::AABB:
return _boundingBox.Intersects(dynamic_pointer_cast<AABBBoxCollider>(other)->GetBoundingBox());
case ColliderType::OBB:
return _boundingBox.Intersects(dynamic_pointer_cast<OBBBoxCollider>(other)->GetBoundingBox());
}
return false;
}
SphereCollider, AABBBoxCollider, OBBBoxCollider 각각 이 방식으로 구현.void Scene::CheckCollision() {
vector<shared_ptr<BaseCollider>> colliders;
for (auto& obj : _objects) {
if (auto collider = obj->GetCollider())
colliders.push_back(collider);
}
for (int i = 0; i < colliders.size(); ++i) {
for (int j = i + 1; j < colliders.size(); ++j) {
if (colliders[i]->Intersects(colliders[j])) {
// 여기에 OnCollisionEnter 등을 호출 가능
int a = 3; // Breakpoint 설정!
}
}
}
}
CheckCollision()에서 일괄 처리.