首先讲一下AABB BOX的缺陷,AABB BOX 是以正方形的包围盒为基准,包围的范围 即是 一个模型的所有顶点中 x y z 最大值,最小值 ,所以在一个旋转后的物体,可能偏差会比较大,因为AABB BOX 只能计算平行的 碰撞检测
这是一个吧AABBOX 画出现况来的实践,可以明显看出,AABB BOX,永远都是平行的,因为这是简单的判断,碰撞的检测也十分粗略。
以下是AABBBOX的代码,主要是来自书 OpenGL ES 2.0游戏开发下卷
findMinAndMax, 是对 所有的顶点遍历,找出 AABBBOX的
而GetCurrentAABBbox,则是计算旋转后的,移动后的真实AABBBOX,可以看到这里多了个
currOrientation
.
orientationData
,是这样的,计算顶点移动后的位置,自然需要用到 矩阵,所以这里采用的是 直接把 顶点左乘旋转矩阵,获得旋转后的坐标点。
package com.bn.Sample5_2;
import android.opengl.Matrix;
public class AABBBox
{
float minX;//x轴最小位置
float maxX;//x轴最大位置
float minY;//y轴最小位置
float maxY;//y轴最大位置
float minZ;//z轴最小位置
float maxZ;//z轴最大位置
public AABBBox(float[] vertices)
{
float[] data=findMinAndMax(vertices);
minX=data[0];maxX=data[1];
minY=data[2];maxY=data[3];
minZ=data[4];maxZ=data[5];
}
public AABBBox(float minX,float maxX,float minY,float maxY,float minZ,float maxZ)
{
this.minX=minX;
this.maxX=maxX;
this.minY=minY;
this.maxY=maxY;
this.minZ=minZ;
this.maxZ=maxZ;
}
//初始化最大最小
public void init(float[] data)
{
data[0]=Float.POSITIVE_INFINITY;
data[1]=Float.NEGATIVE_INFINITY;
data[2]=Float.POSITIVE_INFINITY;
data[3]=Float.NEGATIVE_INFINITY;
data[4]=Float.POSITIVE_INFINITY;
data[5]=Float.NEGATIVE_INFINITY;
}
//每个顶点中找出 x y z的最大 最小值,作为AABB BOX