Building a 3D Portal Engine 笔记之(1) Data Structure For 3D Graphics

You won't get good by reading books, you get good by making mistakes.

前提:

基本上,一个基于Portal的引擎是为了减少渲染的顶点数。适合放置Portals的位置有门,走廊,窗户等等.Portal渲染可以很好的和户外引擎相结合:如果你用其它类型的引擎来渲染户外地形,你可以在进入室内的洞口处放置一个Portals。一旦Render遇到Portal,你可以简单的转换为Portal渲染,来显示Portal后面的东西。

 

3D图形中的数据结构 

一个好的3D引擎,需要定义以下基本的数据:

1. World Structure

一个World将非常大,以致于你不能在每帧完全显示它,所以你需要一种允许切分的结构。这也意味着必须有连接两个世界的link;也许你需要动态的世界,这又要你重新思考另一种结构。

class World

     {

     SectorList* sectors;

     };

 

2. Sector (Local) Structure

class Sector

     {

     PolygonList* polygons;

     ObjectList* objects;

     };

 

3. Object Structure

class Object

     {

     PolygonList* polies;

     ObjectList* childs;

     Matrix matrix;

     };

一个指向objectslist对象的指针用它来指向childs.因为如果父结点变化,子结点也应该变化,比如人的身体动手臂也跟着动(ogre里一样).因此这个结构还带了一个用于描述变化的矩阵。

 

4. Polygon Structure

class Polygon

     {

     VertexList* vertices;

     Texture* texture;

     Sector* sector;

     Plane plane;

     };

使用VertexList队列这样可以有任意数目的顶点,不过为了保存指向下个顶点的指针,每个vertex必须多花费4个或者更多字节。不过也可以选择数组,可以使用STL另一个需要注意的是sector指针。这是用在portal多边形中的:因为一个portal连接着两个sectors. 最后是plane结构,它表示多边形所在的平面,这样可以方便地复用平面(以后介绍.)。

class Vertex

     {

     Coordinate* position;

     float U, V;

     };

class Coordinate

     {

     Vertex original;

     Vertex rotated;

     boolean processed;

     };

Coordinate类中包含源向量和旋转向量。 你必须确保源向量非常精确。因为就算很精确的浮点算数也不能阻止你在旋转中引入误差。boolean变量processed表明顶点是否在当前帧被旋转,这就排除了重复旋转。这里你也可以用一个保存当前帧计数int来替代,这样就可以不用每帧重置processed

另外:
1.不要在引擎的开发初期使用汇编语言,它通常是优化的最后步骤。

2.不要使用固定的值,比如当定义一个多边形的顶点数时。更通用的是:使数据结构可以扩展。


原文详见:http://www.flipcode.com/portal/

你可能感兴趣的:(graphics)