The Annotated ATI SDK BSP Tree Source Part II:Data Structure

 

The Annotated ATI SDK BSP Tree Source

Part II:Data Structure

丁欧南

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

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

这篇文章将接触BSP.h中所定义的数据结构.

 

1.BSP Tree数据结构

1.1三角形信息

ATI SDK以三角形作为基本单位.

struct BTri {

       void setup();

       void split(BTri *dest, int &nPos, int &nNeg, const vec3 &normal, const float offset, const float epsilon = 0) const;

       bool intersects(const vec3 &v0, const vec3 &v1) const;

       bool isAbove(const vec3 &pos) const;

       vec3 v[3];

       vec3 edgeNormals[3];

       float edgeOffsets[3];

       vec3 normal;

       float offset;

       void *data;

};

 

setup:      初始化信息

split:        在构建BSP,若分割面与相应三角形相交,则分割当前三角形.

              dest是分割后的三角形集,dest[0,nPos)是位于分割面法线方向的三角形,dest[nPos,nNeg)是位于分割面发现反方向的三角形.

              normal,offset分别是分割面的法线(已归一化),偏移量.

              epsilon是对于误差的容量.

isAbove:  判断pos所指出的位置是否正投影在当前三角形上.

v:            三角形的三个顶点,逆时针旋向为正面.

edgeNormals:  每条边的法线,都是垂直于边且指向三角形里.

edgeOffsets:   每条边的偏移量,但其计算方法却是以-edgeNormals为其法线,详细情况见setup的剖析.

normal:    三角形所在平面的法线.

offset:     三角形所在平面的偏移量,normal为法线.

data:        BSP未使用.

 

1.2BSP Tree节点信息

struct BNode {

       ~BNode();

       int getSize() const;

       void build(Array <BTri> &tris, const int cutWeight, const int unbalanceWeight);

       void read(FILE *file);

       void write(FILE *file) const;

       bool intersects(const vec3 &v0, const vec3 &v1, const vec3 &dir, vec3 *point, const BTri **triangle) const;

       bool pushSphere(vec3 &pos, const float radius) const;

       BNode *back;

       BNode *front;

       BTri tri;

};

 

build:       根据三角形集tris构建BSP Tree,cutWeight,unbalanceWeight是为了提供构建基本平衡的BSP Tree的权重,通过计算权重,来决断最佳分割面.

intersects:       取得以v0为始,v1为终的线段dir与但前三角形triangle的交点point.

pushSphere:    BSP Tree中插入一个以pos为圆心,radius为半径的球,通过pushSphere的迭代,不断修正pos,使球体不与场景相碰撞.

back:       当前三角形所在平面反面(法线反向)的三角形集.

front:      当前三角形所在平面正面(法线方向)的三角形集.

tri:          存储的当前三角形.

 

1.3BSP Tree

class BSP {

public:

       BSP(){

              top = NULL;

       }

       ~BSP(){

              delete top;

       }

       int getSize() const;

       void addTriangle(const vec3 &v0, const vec3 &v1, const vec3 &v2, void *data = NULL);

       void build(const int cutWeight = 3, const int unbalanceWeight = 1);

       bool load(const char *fileName);

       bool save(const char *fileName) const;

       bool intersects(const vec3 &v0, const vec3 &v1, vec3 *point = NULL, const BTri **triangle = NULL) const;

       bool pushSphere(vec3 &pos, const float radius) const;

protected:

       Array <BTri> tris;

       BNode *top;

};

 

tris:         三角形集.

top:         BSP Tree根节点.

addTriangle:    向三角形集tris中添加三角形.

build:       构建BSP Tree.

intersects:       BNodeintersects的包装调用.

pushSphere:    BNodeintersects的包装调用.

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值