本文主要是介绍OBB碰撞及四叉树优化,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
项目最近在移植lua,考虑到后续会用到帧同步,就自告奋勇,尝试写一下碰撞系统,原来实现过AABB的碰撞,OBB碰撞就是在AABB的碰撞上加了个旋转,可理解为有向的AABB(AABB为轴对其,可理解为在同一坐标系中,各碰撞的正方向轴都一样),下图为AABB与OBB区别
刚开始做的时候把这个碰撞想的太简单,没有经过深思熟虑,直接就开始写,结果导致越写越乱,越写东西越多,写代码还是得先设计!
AABB碰撞检测
1.AABB构造:
矩形包围盒可采用:
①中心点加宽高
②者对角线两个点。(这是小学还是初中数学知识记不清了,确定一个矩形的方法)。
方便更新的话,我采用了中心点加宽高的构造,代码中物体变了位置,就改变一个position就行(AABB的center默认为position)
球形包围盒:圆心center,半径R
2.AABB相交;
①矩形与矩形相交:
其中min与max 都是根据AABB自身计算出的数值
②矩形与球形相交:
找到球与矩形最近的一点,最近的一点都没有相交,则不相交。这个转换需要自己想一会,刚开始我也没想明白,想明白了就好了。
if (other.Shape == ShapeType.Sphere){ColliderSphere sphere = other as ColliderSphere;FixPoint x = sphere.Position.x;FixPoint y = sphere.Position.y;FixPoint z = sphere.Position.z;if (x > MaxX) { x = MaxX; }if (x < MinX) { x = MinX; }if (y > MaxY) { y = MaxY; }if (y < MinY) { y = MinY; }if (z > MaxZ) { z = MaxZ; }if (z < MinZ) { z = MinZ; }FixPoint distance = (x - sphere.Position.x) * (x - sphere.Position.x) + (y - sphere.Position.y) * (y - sphere.Position.y) + (z - sphere.Position.z) * (z - sphere.Position.z);if (sphere.Radius * sphere.Radius >= distance){return true;}return false;}
③圆与圆相交:无需多言
if
这篇关于OBB碰撞及四叉树优化的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!