平民程序 - linghuye's blog

天下风云出我辈,一入江湖岁月催。皇图霸业谈笑中,不胜人生一场醉。提剑跨骑挥鬼雨,白骨如山鸟惊飞。尘事如潮人如水,只笑江湖几人回。

随笔 - 221, 文章 - 0, 评论 - 680, 引用 - 0
数据加载中……

PolygonSoup碰撞检测学习笔记

解决PolygonSoup碰撞检测的成熟方案是使用层次BV树,根据BV的不同衍生出:AABB,OBB,K-dop三种方案.
在内存使用上: AABB -> OBB -> K-dop递增.在效率上则尚无定论,根据具体的应用环境不同而不同.

Opcode: 开源,完全免费,采用AABB树构造,内存耗用很小,支持复杂模型,起初想使用它,但发现其,基本上没有文档,Sample,1.3版本接口变动巨大,且无文档,自2003年来再无更新,最致命的是不支持Instance transform的Scale,AABBCollider没有Transform支持,而且是在看代码时发现的,吐血.主要设计目标是少的内存耗用,但速度也很快.为ODE,Tokamak,Crystal Space所用.

RAPID: 开源,免费,采用OBB构造,内存耗用巨大,学院派设计,最倒霉的库,因为其他每个库都拿它作比较,都说比它快.

SOLID: GPL开源,商业软件,采用AABB树构造,2005.4月出3.5版本,效率不错,内存耗用中等,在后面4.0会支持AABB数据压缩,有文档,接口简单,代码清晰.支持复杂模型,支持Instance transform的Scale,甚至支持各向不等缩放,支持Penetration Depth计算,cool.作者Gino van den Bergen是3D碰撞研究专家,著有:Collision Detection in Interactive 3D Environments一书,有e版.逻辑顺畅地集成入DM,效果不错,满足使用要求.不过其IndexBuffer是unsigned int,Matrix是DX风格的,但代码很清晰,很容易定制.
SOLID有个严重的Bug,必须确保DT_GetCommonPoint,DT_GetPenDepth,DT_GetClosestPair在检测Complex和Convex对象时,第一个参数必须是Complex对象,否则崩溃.因为SOLID的double dispatch实现有问题,不完整,没有Convex + Complex顺序的对应函数.

QuickCD: 开源,免费,K-dop树构造.

ColDet,支持复杂模型,也不支持Instance Transform的Scale.

Reference:
http://www.codercorner.com/Opcode.htm
http://www.dtecta.com/
http://www.cs.unc.edu/~geom/OBB/OBBT.html
http://www.ams.sunysb.edu/~jklosow/quickcd/QuickCD.html
http://photoneffect.com/coldet/
http://www.merl.com/projects/vclip/
http://www.q12.org/ode/ode.html

void DmModel::SetBoundPolygonSoup(uint32 nPolygonSoupVertices, vec3_type* pVertices, uint32 nTrianglePrims, uint16* pTrianglePrims)
{    
    ASSERT(m_hSolidShape 
== NULL);
    
    
if(nTrianglePrims == 0return;
    
if(nPolygonSoupVertices == 0return;
            
    
// Save polygon soup data for collision test!
    m_pPolygonSoupVertices = new vec3_type[nPolygonSoupVertices];
    memcpy(m_pPolygonSoupVertices, pVertices, 
sizeof(vec3_type) * nPolygonSoupVertices);
    
    
// Build 
    DT_VertexBaseHandle hVertexBase = DT_NewVertexBase(m_pPolygonSoupVertices, 0);
    m_hSolidShape 
= DT_NewComplexShape(hVertexBase);
    m_hSolidVertexBase 
= hVertexBase;
        
    
// Define mesh triangles
    for(uint32 i = 0; i < nTrianglePrims; i += 3)
    
{    
        DT_VertexIndices(
3, pTrianglePrims + i);
    }

    
    
// End it
    DT_EndComplexShape();
}


void DmModelInstanceNode::BuildPhysics()
{    
    
// Setup Phisic stuffs
    DT_ShapeHandle hShape = (DT_ShapeHandle)m_pRefModelInstance->m_pRefModel->m_hSolidShape;
    
if(hShape)
    
{    
        DT_ObjectHandle hObject 
= DT_CreateObject(NULL, hShape);
        DM_SetMatrixf(hObject, m_matTransform);
        m_hSolidObject 
= hObject;
    }

}


void DmGameCreature::BuildPhysics()
{    
    ASSERT(m_hSolidObject 
== NULL);
    
    vec3_type vMin, vMax;
    getBoundBox(vMin, vMax);
    DT_ShapeHandle hShape 
= DT_NewBox(vMax.x - vMin.x, vMax.y - vMin.y, vMax.z - vMin.z);
    DT_ObjectHandle hObject 
= DT_CreateObject(NULL, hShape);
    
    m_hSolidShape 
= hShape;
    m_hSolidObject 
= hObject;
}


bool DmModelInstanceNode::TestCollision(HANDLE hSolidObject)
{    
    
if(!m_hSolidObject) return false;
    
    DT_ObjectHandle hTestObject 
= (DT_ObjectHandle)hSolidObject;
    DT_ObjectHandle hThisObject 
= (DT_ObjectHandle)m_hSolidObject;
        
    DT_Vector3 v;
    
return (DT_GetCommonPoint(hThisObject, hTestObject, v) != 0);
}

posted on 2005-12-26 22:59 linghuye 阅读(2893) 评论(22)  编辑 收藏 引用 所属分类: 3D图形学研究我的3D引擎 -DestinyMatrix

评论

# re: PolygonSoup碰撞检测学习笔记  回复  更多评论   

你好,我是一名正在做毕业设计的研究生,方向是:三维空间中的碰撞检测,当我有了新的方法或者思路后,一个要解决的问题就是如何去验证,因此我需要一个碰撞检测系统,来测试出各项参数和数据。
请问你哪里有吗?可以共享给我吗?很感谢你,因为这几天实在是逼的急了。
2006-03-13 09:47 | 高玉泉

# re: PolygonSoup碰撞检测学习笔记  回复  更多评论   

如果只是碰撞检测的话,你可以使用SOLID程序包.
2006-03-13 13:01 | 平民程序

# re: PolygonSoup碰撞检测学习笔记  回复  更多评论   

请问一下,你说到的这本Collision Detection in Interactive 3D Environments书的e版哪里有?我是一名在读研究生,目前需要了解碰撞检测方面的相关内容,想看一下这本书。谢谢了
2006-03-30 11:23 | 鸭子

# re: PolygonSoup碰撞检测学习笔记  回复  更多评论   

在Emule上搜索可以找到,扫描版.
2006-03-30 15:38 | linghuye

# re: PolygonSoup碰撞检测学习笔记  回复  更多评论   

现在的NX碰撞部分就是基于OPCODE 的.
2006-04-17 11:41 | kevin_lethe

# re: PolygonSoup碰撞检测学习笔记  回复  更多评论   

不知如何使用这些库,请问能否指点一下?
2008-04-02 14:20 | xjnuaa

# re: PolygonSoup碰撞检测学习笔记  回复  更多评论   

补充以下,准确的说是在wtk中,谢谢
2008-04-02 14:32 | xjnuaa

# re: PolygonSoup碰撞检测学习笔记  回复  更多评论   

您好。我现在在学习碰撞检测,但是在Emule找不到Collision Detection in Interactive 3D Environments 的电子版,您能给我发过了来吗?谢谢!我的邮箱是 err_mmm@21cn.com
2008-04-07 15:35 | err_mmm

# re: PolygonSoup碰撞检测学习笔记  回复  更多评论   

您好,我也找不到Collision Detection in Interactive 3D Environments 的电子版,麻烦您能给我发一份吗?谢谢.我的邮箱是zzz-526@163.com
2008-08-11 14:24 | catherine

# re: PolygonSoup碰撞检测学习笔记[未登录]  回复  更多评论   

您好,您说的那本书真的很难找,一直没找到,劳烦您发一份到我的邮箱里好吗,谢谢。我的邮箱kmpop2000@sina.com
2008-08-27 19:51 | zz

# re: PolygonSoup碰撞检测学习笔记  回复  更多评论   

这本书确实很难找,,劳烦您发一份到我的邮箱里好吗,谢谢。我的邮箱chengming_26@163.com
2008-09-23 10:55 | CM

# re: PolygonSoup碰撞检测学习笔记  回复  更多评论   

我也没找到这本书,能给我也传一份吗?谢谢
我的邮箱:whl020519@163.com
2008-11-14 00:29 | whl020519

# re: PolygonSoup碰撞检测学习笔记  回复  更多评论   

也能给我发一份不
qloach@qq.com
2009-02-20 11:39 | loach

# re: PolygonSoup碰撞检测学习笔记  回复  更多评论   

您好,我也想要这本书,邮箱:god_wyj@163.com
2009-04-13 13:28 | Elaine

# re: PolygonSoup碰撞检测学习笔记[未登录]  回复  更多评论   

http://www.cnitblog.com/linghuye/archive/2009/01/23/53981.html
2009-04-15 18:29 | linghuye

# re: PolygonSoup碰撞检测学习笔记  回复  更多评论   

你好!我一直遍寻 Collision Detection in Interactive 3D Environments 这本书不得!能不能发给我一份?十分感激!
2009-06-04 09:59 | zhaolinfeng

# re: PolygonSoup碰撞检测学习笔记  回复  更多评论   

你好!我一直遍寻 Collision Detection in Interactive 3D Environments 这本书不得!能不能发给我一份?十分感激!

忘了我的邮箱了::)
sd2602061@126.com
sd2602061@163.com

再次感谢!
2009-06-04 10:03 | zhaolinfeng

# re: PolygonSoup碰撞检测学习笔记[未登录]  回复  更多评论   

http://www.ebookee.com.cn
2009-06-05 21:06 | linghuye

# re: PolygonSoup碰撞检测学习笔记  回复  更多评论   

你好 Collision Detection in Interactive 3D Environments 这本书的电子版能不能发给我一份?十分感激! 我的邮箱是liyongsheng411503@163.com
2010-04-20 16:51 | foreverzzu

# re: PolygonSoup碰撞检测学习笔记  回复  更多评论   

您好,Collision Detection in Interactive 3D Environments 的电子版能不能发给我一份,谢谢您,我的邮箱是:zhoudeji2006@163.com
2010-04-21 22:58 | zdj
只有注册用户登录后才能发表评论。