6-三维游戏场景的组织和管理

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
• 最贴近物体的长方体 • 显著减少包围体的数目
– 凸体包围体K-DOP(Disceted Orientation Polytype)
• 8-DOP +45, -45, +90, -90, +135, -135,+180, -180
三维场景的组织与管理(空间剖分)
八叉树 Octree (quad-tree for 2D):
三维场景的组织与管理
• 场景图(有向 循环图,DAG)
三维场景的组织与管理
typedef struct treenode { GLfloat m[16]; void (*f)(); struct treenode *sibling; struct treenode *child; } treenode;
17
三维场景的组织与管理
• 场景包围体与场景剖分技术比较
场景包围体技术 表示方式 剖分方式 聚类方式 层次细节 主要作用 代表方法 层次物体表示 物体剖分 物体的层次聚类 物体层次细节 基于物体将空间区域区分 包围球树、OOB树、 AABB树、k-DOP树 场景剖分技术 层次空间表示 场景剖分 空间的层次聚类 空间层次细节 基于区域区分物体 BSP、四叉树、八叉树、 均匀三维网格
12
三维场景的组织与管理(空间剖分)
• 八叉树
– 自顶向下,自底向上
• 如果一个多边形和两个以上节点相交,可以将多边 形添加到每个与它相交的节点中
– 增加了场景中多边形数目,但是构造简单 – 视域裁剪和碰撞检测更方便,适用于复杂三维 游戏引擎
三维场景的组织与管理(空间剖分)
then to K-D tree:
– 场景物体按照绘制状态分类(纹理、材质、光 照、融合等) – 避免状态的频繁切换 – 多重绘制(multi pass rendering)时(光源、阴 影、多重纹理)面临的问题:
• 物体为单位管理?一次性完成物体的绘制 • 状态为单位管理?一个物体需要绘制多次
三维场景的组织与管理(物体剖分)
• 基于物体包围体的场景组织
三维场景的组织与管理(p86)
Java3D中的场景图示例: 几何节点 变换节点 开关节点(对当前节点子节 点进行选择,eg:车轮损坏) OGRE\OSG\...
mSceneMgr>getRootSceneNode()>createChildSceneNode();
三维场景的组织与管理
• 基于绘制状态的场景管理
问题:以渲染为例
• ISA -> PCI-> AGP -> PCI-Express
410M 三角片的场景
Okay? For AGP 8x or PCI-Expressx16
内容
• • • • • • 问题 三维场景的组织与管理 游戏场景的几何优化 地形的绘制与漫游 三维场景的快速可见性判断与消隐 三维场景中的碰撞检测
http://www.cs.umd.edu/users/brabec/quadtree/points/kdtree.html
14
三维场景的组织与管理(空间剖分)
then to BSP tree:
http://symbolcraft.com/graphics/bsp/
15
三维场景的组织与管理(空间剖分)
– 包围球树
• 适合表示圆形物体 • 求交简单
– AABB(AxiБайду номын сангаас Aligned Bounding Box)
• 平行于坐标轴的包围物体的最小长方体 • 内存开销小 • 两个AABB碰撞计算?
三维场景的组织与管理:物体剖分
• 基于物体包围体的场景组织
– OBB(Oriented Bounding Box)
BSP树
Choice of partitioning plane. One can do some probability analysis in selecting a “good” partitioning plane (such as E[T] = 1 + p- E[T-] + p+E[T+] as an example). Usually, BSP is constructed with a top-down approach with heuristics such as: – Use a partitioning plane that cuts the least number of polygons – Attempt to balance the number of polygons in each subtree – Use the largest polygon as the cutting plane
void traverse(treenode *root) { if(root == NULL) return; glPushMatrix(); glMultMatrix(root->m); root->f(); if(root->child != NULL) traverse(root->child); glPopMatrix(); if(root->sibling != NULL) traverse(root->sibling); }
• BSP树
– 选择剖分面的原则:等体积,等最 大体,最长剖分线,树的深度 – 可应用于深度排序、碰撞检测、绘 制、节点裁剪、潜在可见集绘制中 – 通常需要剖分多边形,增加了多边 形数量 – 构造时间较长,通常以预处理方式 进行,不太适合动态场景(油画家 算法,室内场景)p92
void traversa_btf (Tree *t, Point vp){ if (t == NULL) return; if (vp in the back of the plane at root of t){ traverse_btf ( t_front, vp ); /* draw_polygon_on_node of t; */ traverse_btf ( t_back, vp ); } else { traverse_btf ( t_back, vp ); /* draw_polygon_on_node of t; */ traverse_btf ( t_front, vp ); }}
三维游戏场景的组织与绘制
问题
• 碰撞检测 • 可见性判断
410M 三角片的场景
• 光线物体求交
• 绘制(渲染,rendering)
问题:以渲染为例
• 渲染场景或物体时,需要将其信息由CPU传 送的GPU:
– 场景包含 1M 三角形,渲染速度30 FPS. – 每个三角形包含3个顶点 – 每个顶点包含三个坐标 (float类型的坐标点4字 节) – 每个三角形 36 bytes(还不包含纹理坐标、法向 量等其他信息) – 需要传输: 1M x 30 x 36 bytes/sec= 1080 MB/sec
相关文档
最新文档