OpenGL ES 简单的物理检测AABBBOX

本文探讨了AABB BOX在OpenGL ES中的应用,指出其在旋转物体碰撞检测中的局限性,通过实例展示了AABB BOX始终平行的特点。文章提供了AABBBOX的实现代码,包括找到最小最大值的函数和计算实际包围盒的方法,并提到在物理碰撞检测中需要注意的问题,如线程间的同步和锁的使用。
摘要由CSDN通过智能技术生成
首先讲一下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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值