包围体Bounding Volumes
有时候我们想要计算一个mesh模型的Bounding Volume。一般使用圆形和AABB。如下图,左边AABB,右边圆形:
圆形是由它的圆心和半径确定其位置,AABB是有其最小和最大顶点确定位置。
如果希望更加准确的碰撞,那么就可以测试到包围体重合之后,就测试其meshes中的三角形是否重合,重合即碰撞。三角形(ray/triangle intersection)测试会很消耗时间。
我们可以手工计算AABB和圆形包围体,但是Direc3D的D3DX库里面提供了自动计算一个mehs模型的AABB和圆形的。只要知道其顶点数组,那么就可以计算了。
HRESULT D3DXComputeBoundingSphere(
LPD3DXVECTOR3 pFirstPosition,
DWORD NumVertices,
DWORD dwStride,
D3DXVECTOR3* pCenter,
FLOAT* pRadius
);
dwStride: 这个参数有点难理解,就是可以定义其往前跳跃的float数,比如顶点的位置格式是FLOAT3,那么就是占3个float位置,如果带了normal单位法向量信息格式FLOAT3,那么也是占3个float位置,但是计算bounding volume不需要normal的信息,只需要位置信息,那么就可以跳过normal的信息,所以设置dwStride为6。
AABB:
HRESULT D3DXComputeBoundingBox(
LPD3DXVECTOR3 pFirstPosition,
DWORD NumVertices,
DWORD dwStride,
D3DXVECTOR3* pMin,
D3DXVECTOR3* pMax
);
一些特别的常量:
如下使用EPSILON::
Bounding Volume类型
可以如下自定义类:
struct AABB
{
// Initialize to an infinitely small AABB.
AABB()
: minPt(INFINITY, INFINITY, INFINITY),
maxPt(-INFINITY, -INFINITY, -INFINITY){}
D3DXVECTOR3 center()
{
return 0.5f*(minPt+maxPt);
}
D3DXVECTOR3 minPt;
D3DXVECTOR3 maxPt;
};
struct BoundingSphere
{
BoundingSphere()
: pos(0.0f, 0.0f, 0.0f), radius(0.0f){}
D3DXVECTOR3 pos;
float radius;
};
碰撞包围盒例子:
LoadXFile("skullocc.x", &mMesh, mMtrl, mTex);//自动转换mMesh顶点属性为(position, normal, texture)带位置单位法向量和纹理的格式。
D3DXMatrixIdentity(&mWorld);
// Compute the bounding box.
VertexPNT* v = 0;
HR(mMesh->LockVertexBuffer(0, (void**)&v));
HR(D3DXComputeBoundingBox(&v[0].pos, mMesh->GetNumVertices(),
sizeof(VertexPNT), &mBoundingBox.minPt, &mBoundingBox.maxPt));//是用sizeof计算其往前跳跃数
HR(mMesh->UnlockVertexBuffer());
mBox是 ID3DXMesh 对象,存储一个由AABB为边的四方形,然后可以把这个四方形显示出来,当然一般AABB都只是用作碰撞检测,不会直接显示出来的。下面为了显示这个AABB,需要额外功夫去渲染:
transforme mBox.
定义材质:
下面是渲染这个AABB:
总结:
物理碰撞是游戏的一个方向,其数学也非常复杂,但是这些简单的AABB也可以应付不少游戏任务了。
分享到:
相关推荐
1. AABB包围盒 在游戏中,为了简化物体之间的碰撞检测运算,通常会对物体创建一个规则的几何外形将其包围 2. 二维场景中的AABB碰撞检测原理
利用AABB算法对两个物体进行碰撞检测,物体采用三角面片表示,算法输入两个物体碰撞的三角面片对及碰撞检测时间等信息
DirectX vc++ 有注释 碰撞检测 AABB
利用AABB算法实现物体与物体之间的碰撞检测
读OpenGL深度值并结合AABB包围盒做的拣选,但总没成功,请帮忙看看
提供给Ogre的初学者,简单的碰撞检测源代码,原理是轴对称(AABB)
算法充分利用包围盒在检测速度和精度上的不同侧重,对可变形物体建立Sphere和AABB混合包围盒层次树,对刚体建立Sphere和OBB混合包围盒层次树;每个物体的混合包围盒层次树又分成上层、中层和下层,每层使用不同的...
介绍了基于层次包围盒的碰撞检测算法的存储优化方法。该方法从存储空间的角度来改进基于AABB树的碰撞检测算法。根据AABB树的构造过程,减少内部节点的AABB包围盒的存储字节数;基于快速三角形相交测试算法,从叶节点...
DIRECTX 实现 AABB 碰撞检测
为了提高检测速度同时兼顾准确性,将检测分为两个阶段:预处理检测阶段首先均匀剖分待测空间以确定相邻对象,然后对相邻的对象构造AABB-OBB混合层次包围盒,改进包围盒的构造方式,同时改善任务结构加速遍历过程;...
visual c++ DirectX开发3D游戏吃豆人(ORGE 3D游戏引擎+AABB碰撞检测+CEGUI)源代码
AABB包围盒自定义环境阴影
针对可变形物体对碰撞检测实时性和精确性的要求,提出了一种快速的基于混合更新策略的并行碰撞检测算法。该算法对物体建立AABB包围盒层次树,并用八叉树代替常用的二叉树,提高了算法效率;在每个变形时间步采用自顶...
DirectXAABB碰撞检测示例,包含全部源码,下载即可运行,代码均有详细的注释,适合喜欢DirectX的学习者学习借鉴
提出了一种基于着色算法的并行碰撞检测算法,利用AABB包围盒较好的紧密性和包围球计算简单的优点以及并行算法中的分治策略构建物体的混合包围体层次(S-AABB);然后采用破对称技术中的典型算法——着色算法,将每棵...
效率最高的碰撞检测包源码,开发系统用 基于AABB包围盒
Ogre碰撞检测技术,包括AABB,球查询等等