/* Collision detection + response ¸¦ ó¸®Çϴ Ŭ·¡½º Ãæµ¹ »ï°¢ÇüÀÇ culling Àº octree ¸¦ ÀÌ¿ë collision detection °ú response ¾Ë°í¸®ÁòÀº Kasper Fauerby ÀÇ 'Improved Collision detection and Response' ¿¡ ±âÃÊÇÏ´Â ÄÚµåÀÌ´Ù */ #pragma once #include "./Vector3.h" #include // forward decl. struct IDirect3DDevice8; namespace CrossM{ namespace Scene{ struct CollisionTriangleInfo { Math::VECTOR3 m_avVertex[3]; // ºÎ°¡Àû Á¤º¸..À̸¦Å׸é ÀÌ »ï°¢ÇüÀÌ ¼ÓÇÑ ¿ÀºêÁ§Æ®ÀÇ id ¶ó´ø°¡. ±×·±°ÍÀÌ ÇÊ¿äÇÒµí // ¿ÀºêÁ§Æ® Ŭ·¡½º(ÁöÇü/ÇϿ콺/¿ÀºêÁ§Æ®)+ÇÑ Å¬·¡½º ³»¿¡¼­ÀÇ ¿ÀºêÁ§Æ®ID(°¢ ÇϿ콺º° °íÀ¯¹øÈ£) // °°Àº ½ÄÀÇ ÀÚ·áÇüÀÌ µÉÁöµµ? Math::VECTOR3 m_vFaceNormal; }; // octree ÀÇ node. ¸®ÇÁ ³ëµå»Ó ¾Æ´Ï¶ó Áٱ⠳ëµåµµ »ï°¢ÇüÀÇ À妽º¸¦ °¡Áú ¼ö ÀÖ´Ù. // ¹Ù¿îµù ¹Ú½º ³»¿¡ »ï°¢ÇüÀÇ ¼¼ Á¡ÀÌ ¿ÏÀüÈ÷ Æ÷ÇԵǴ »ï°¢Çü¸¸ ±× ³ëµåÀÇ »ï°¢Çü À妽º ¸®½ºÆ®¿¡ ±â·ÏµÈ´Ù. // (°æ°è¿¡ °ÉÄ¡´Â ±× »ï°¢ÇüÀÇ ¼¼ Á¡À» ´Ù Æ÷ÇÔÇÏ´Â »óÀ§ ³ëµå¿¡ ±â·ÏµÊ) class COctreeCollisionNode { public: COctreeCollisionNode(); ~COctreeCollisionNode(); // Çö ³ëµåÀÇ ÇÏÀ§ ³ëµåµéÀ» Àç±ÍÀûÀ¸·Î ¸ðµÎ ÇØÁ¦ void ReleaseSubNode(); // leaf node ÀÎÁö üũ bool IsLeafNode(); // ÀÚ½Ä ³ëµåµéÀ» »ý¼ºÇϰí, ÀÚ½ÅÀÇ ³ëµå¿¡ Æ÷ÇÔµÈ »ï°¢ÇüÀÇ À妽ºµéÀ» ÀÚ½Ä ³ëµå·Î ºÐ»ê½ÃŲ´Ù. // ÀÚ±â ÀÚ½ÅÀÇ ³ëµå¿¡´Â ¹Ù¿îµù¹Ú½º °ªÀÌ ¼¼ÆÃµÈ »óÅ¿©¾ß ÇÑ´Ù. void BuildSubNode( const std::vector< CollisionTriangleInfo >& vecTriangle, const size_t nMaximumRecursion, const size_t nMinPolyCount, size_t nCurrentRecursionLevel); // Ãæµ¹ °´Ã¼ÀÇ swept volume ¿¡ °É¸®´Â Ãæµ¹ ³ëµåµéÀÇ ¸®½ºÆ®¸¦ vecCollidableNode ¿¡ ÀúÀå void CollectCollidableNodes( const Math::VECTOR3& vSweptVolumeMin, const Math::VECTOR3& vSweptVolumeMax, std::vector< COctreeCollisionNode* >& vecCollidableNode); Math::VECTOR3 m_vBoundingMin; Math::VECTOR3 m_vBoundingMax; std::vector< size_t > m_vecTriangleIndex; COctreeCollisionNode* m_apSubNode[8]; }; class COctreeCollider { public: COctreeCollider(); ~COctreeCollider(); ////////////////////////////////////////////////////////////////////////// // // Octree Build °ü·Ã ¸Þ¼Òµå /* Ãæµ¹ »ï°¢Çü °¹¼ö¸¦ ¼³Á¤. Ãæµ¹ »ï°¢ÇüÀÌ ³»ºÎÀûÀ¸·Î ÀúÀåµÉ °ø°£ÀÌ ÇÒ´çµÇ°í, octree Á¤º¸°¡ ÆÄ±«µÈ´Ù. BuildOctree() °¡ È£ÃâµÇ±â Àü±îÁö COctreeCollider ´Â Á¤»óÀÛµ¿ÇÏÁö ¾Ê´Â´Ù */ void SetTriangleCount(unsigned int uiTriangleCount); /* »ï°¢Çü µ¥ÀÌÅÍ ÀúÀå¼ÒÀÇ Æ÷ÀÎÅ͸¦ ¹Ýȯ. ÀÌ ¸Þ¼Òµå¸¦ È£ÃâÇÏ¸é »ï°¢Çü µ¥ÀÌÅͰ¡ º¯ÇüµÈ°ÍÀ¸·Î °£ÁÖ, octree Á¤º¸°¡ ÆÄ±«µÈ´Ù. BuildOctree() °¡ È£ÃâµÇ±â Àü±îÁö COctreeCollider ´Â Á¤»óÀÛµ¿ÇÏÁö ¾Ê´Â´Ù */ void GetTriangleDataPtr(CollisionTriangleInfo*& pTriangleData); // ¼¼ÆÃµÈ »ï°¢Çü Á¤º¸¸¦ ±âÃÊ·Î octree Á¤º¸¸¦ ±¸Ãà bool BuildOctree(const size_t nMaximumRecursion, const size_t nMinPolyCount); ////////////////////////////////////////////////////////////////////////// // // Ãæµ¹°ËÃâ ¹× ¹ÝÀÀ ¸Þ¼Òµå /* ÁÖ¾îÁø Ÿ¿øÃ¼ÀÇ ÀÌÀü À§Ä¡(prevPos)¿Í À̵¿ÇÒ À§Ä¡(nextPos) ¸¦ ÆÄ¶ó¹ÌÅÍ·Î ³Ñ±â¸é, Ãæµ¹À» üũÇϰí Ãæµ¹ÀÌ ÀϾÀ» °æ¿ì ÀûÀýÇÑ À§Ä¡·Î ¼öÁ¤µÈ À̵¿ À§Ä¡¸¦ ¹ÝȯÇÑ´Ù. */ void GetCollisionRespondingPosition( Math::VECTOR3& vRespondingPos, const Math::VECTOR3& vPrevPos, const Math::VECTOR3& vNewPos, const Math::VECTOR3& vEllipsoidRadius, const unsigned int nRecursionLevel = 1); // Å×½ºÆ®¿ë ¸Þ¼Òµå, Ãæµ¹ÀÌ ÀϾ ¼ö Àִ°ÍÀ¸·Î È®ÀÎµÈ ³ëµåÀÇ »ï°¢ÇüµéÀ» ·»´õ void RenderCollidableNodeTriangles(IDirect3DDevice8* pDevice); private: std::vector< CollisionTriangleInfo > m_vecCollisionTriangle; Math::VECTOR3 m_vCollisionBoundingMin; Math::VECTOR3 m_vCollisionBoundingMax; COctreeCollisionNode m_octreeRootNode; // Àӽÿë, Ãæµ¹ÀÌ ÀϾ ¼ö Àִ°ÍÀ¸·Î È®ÀÎµÈ leaf ³ëµåµé std::vector< COctreeCollisionNode* > m_vecpCollidableNode; // Àӽÿë, ·»´õ¿ë ¹öÅØ½º µ¥ÀÌÅÍ std::vector< Math::VECTOR3 > m_vecRenderVertex; // Àӽÿë. Ãæµ¹ÀÌ ÀϾ »ï°¢ÇüÀÇ À妽º size_t m_nColTriIndex; }; }}