前提:
基本上,一个基于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/