The Annotated ATI SDK BSP Tree Source Part I:Theory

The Annotated ATI SDK BSP Tree Source

Part I:Theory

丁欧南

Keyword:[Triangle Split][Collision Detection][Bounding Sphere]

此系列文章介绍包含在ATI SDK(March 2006)中的BSP Tree源代码,它实现了这些主要功能:BSP Tree 的离线编译,对第一人称视角的碰撞检测(实际上是Bounding Sphere Collision Detection).

这篇文章主要介绍在源码中出现的一些技术,并不直接涉及源码.

 

1.为什么使用ATI SDK BSP Tree source code

ATI SDK Framework是出于教学目的而书写的,它的变量命名能提示很多信息,也没有为了效率而作极端优化致使可读性下降.相比于其它那些将渲染代码,碰撞检测,输入处理等功能揉在一个文件里的教程,这份BSP Tree实现无疑将更具有剖析的价值.

另外我要说的是,对于BSP Tree,我也是初次接触,各种功能都在探索之中,此篇文章就是探索过程中的一份笔记.

 

2.BSP Tree原理

BSP Tree的最基本动机在于分而治之.对于碰撞检测(Collision Detection),最关键在于找到碰撞点,而如果通过遍历所有多边形来找寻碰撞点的话,速度将会很慢,通过使用BSP,就可以在遍历的同时不断地缩小查找范围,达到较高的效率.非可见面剔除技术也是基于这样的原理,不断地将大问题(大场景)化归为小问题(单独的多边形).

 

3.计算机的实数计算

在计算机上的实数以浮点数来表示,它的计算并非理想.举个实际的例子:拿一个手持式袖珍计算器,输入2,然后连续执行10次求平方根运算,再接着执行10次平方运算,最后我们期望仍能得到2这个结果,但你会发现实际并非如此.它总是显示一个极接近2的数,但这个数确确实实不是2.这在计算机中也会出现如此问题.对于计算机几何中的计算来讲,如果你单纯判断一个数据是否等于2,那你将遇到无数次失败,一个可用的方法是,对判断的条件略微放松,例如允许一些误差存在,将一些与2极为接近的数也视为2.原先的判断式应改为:if(fabsf(x-2)<=epsilon)… ,epsilon就是你所能容忍的误差最大值.ATI SDK将其设置为 0.001f ,另外,fabsf的作用是执行浮点数绝对值操作,再将其转换为浮点数类型.这些都将在代码里出现.

 

4.取得交点的算法

4.1平面方程

已知平面上一点P,及其面法线normal,求取此平面的点集.

由平面的定义知:平面上任一条射线都与法线垂直,因此设此平面点集为Q,则有(Q-P)·normal=0,这就是平面方程.

如果normal是被归一化的(normalized),则表达式d=-P·normal就是此平面到原点的有符号偏移量(offset).

4.2线段与平面的交点

设线段起始点为S,V为延伸方向,t为缩放系数.

则线段L=S+tV,代入平面方程,(L-P)·normal=0

S·normal+tV·normal+offset=0

解出t:

 

再将t代回原来的线段方程即可求出交点.

4.3线段与三角形的交点

这一节与4.2节的不同之处在于,三角形是一个封闭平面,除了要使用4.2节介绍的算法以解出线段与三角形所在平面的交点,还要检查交点是否在三角形之内.可以这样计算:利用offset的正负来判断交点是否在三角形一条边以内,这样循环判断三条边以后,如果都在三角形的边以内,则可以断定交点在三角形以内,于是所求出的交点有效.

 

5.点到平面/直线的距离

向量点积(Dot Product)将一条向量投射到另一条向量上,利用这个性质,来求取距离.d=(Point_Position-P)·normal,这个d依然是有符号距离,d<0,点在平面/直线背面,d>0,点在平面/直线正面,d=0,点在平面/直线上.

 

6. ATI SDK BSP Tree 代码框架

代码全部在ATI_SDK_ROOT/Samples/Framework

Math/Vector.h Math/Vector.cpp: 向量实现

Util/Array.h: 类似STL::vector的动态数组

Util/BSP.h Util/BSP.cpp: BSP Tree

 

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值