项目最近在移植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;
}</