3D游戏中的BSP 二叉空间分割 技术
- 格式:doc
- 大小:45.80 KB
- 文档页数:10
DirectX不是全部!3D游戏图形技术解析2010年02月19日00:00 出处:泡泡网【原创】作者:孙敏杰编辑:孙敏杰在本页阅读全文(共9页)泡泡网显卡频道2月19日近年来3D图形技术的发展势头非常迅猛,软件方面游戏的画面和逼真度有了长足进步,硬件方面显卡的更新换代越来越频繁。
但始终存在这样一个现象,无论显卡的性能翻多少倍,游戏玩家们总感觉还是不够强大,GPU庞大的运算能力到底被谁吃掉了呢?答案很简单,游戏为了提高画面质量、更加接近于真实世界,使用了诸多先进的图形技术,特效的“滥用”大幅提升了游戏画面水平,但也抵消掉了GPU性能的增长。
那么最新的图形技术到底能给游戏带来多少的画面改进,对于显卡的需求会有多夸张呢?今天笔者就将主流游戏中使用最广泛的技术提取出来,对其原理和需求进行详细的分析,以飨读者。
其实很多最先进的游戏高级图形技术都包括在了新版本的DirectX API当中,或者说是通过DirectX中的Shader Model新指令集来实现。
但这些东西并不容易理解,也不够直观,所以本文反其道而行之,通过肉眼可以看得出来的差别来分析DirectX版本更新对于图形技术的改进到底有多大?运动模糊(Motion Blur)●游戏中为什么需要模糊处理?清晰一点不是更好吗?首先请大家思考一个问题:为什么每秒24帧的速度对于电影来说已经足以获得很流畅的视觉效果,而对于游戏来说却会显得磕磕碰碰呢?原因很简单,摄像机在工作的时候并非一帧一帧绝对静止的拍摄,它所摄下的每一帧图像已经包含了1/24秒以内的所有视觉信息,包括物体在这1/24秒内的位移。
如果在看电影的时候按下暂停键,我们所得到的并不是一幅清晰的静止画面,而是一张模糊的图像,问题就出在这里!传统的电脑3D图像做不到这一点,游戏里的每一帧就是一幅静止画面,如果你在运动的过程中截一张图片下来,得到的肯定是一幅清晰的静态图。
很多游戏中都有运动模糊的选项所以,运动模糊技术的目的有二:一是增强快速移动场景的真实感,二是在FPS并不高的时候让游戏显得不是很卡。
Bullet3⼊门Bullet3 ⼊门Bullet3 简介是⼀个开源免费(Zlib)的物理引擎,⼴泛应⽤于游戏、动画、电影和机器⼈仿真等领域。
Blender、Maya、Unity3D 插件、gazebo、V-rep、Roboschool 等都使⽤了这个物理引擎。
其他的物理引擎还有、Havok 等。
物理引擎的主要功能1. 连续和离散物体的碰撞检测,物体形状包括⽹格和基本⼏何体的。
2. 快速稳定的刚体约束求解器,包括车辆动⼒学、⼈体、直线约束、铰链约束等等。
3. 软体物体动⼒学,包括⾐服、绳⼦、可变形体等,同时⽀持约束。
4. ⾃定义格式.bullet,⽀持 URDF 格式,和 bsp 格式。
整体架构呈分层结构,每个模块都可以单独拿来使⽤。
下图展⽰了引擎运⾏的流程图引擎从左向右执⾏,从施加重⼒开始,到位置改变,坐标系变换结束。
数据结构⼏何模型形状: shape 类抽象出了⼏何形状的特征, ⽐如长⽅体, 球, 四⾯体,凸包. bullet 中的形状类型⾮常丰富,有⼏⼗种之多. 由于⼏何形状的特征是和具体对象⽆关的,所以⼀种形状只要维持⼀个实例即可, 所有映射到该 shape 的对象可以共享这个实例.包围体(BVH): 采⽤的是 AABB, ⼀般有 AABB, OBB, K-Dop, Convex Hull.空间划分:主要是 Dynamic AABB Tree (刚体,曼哈顿距离) 和 Sweep and Prune (soft body)碰撞检测算法:GJK ,sweep prune,box2box, shpere2shpere 等接触点:约束: 六种约束类型,见⽂档motion state: 对渲染引擎提供的⼀个接⼝, 便于渲染引擎更新渲染对象的位置完成⼏何基础构建后,在⼀个场景(collision world)内加⼊各个被模拟的物理对象(collision object)每个物理对象被映射到对映的 shape, 空间划分数据结构节点. 如果再在这些对象⾝上附加例如速度,⾓速度,转动惯量等物理特征,就演化为 rigid object. Soft body 情况复杂⼀些, ⼀般由 mesh 构成物理仿真Broad Phase: ⾸先进⾏远距碰撞检测, 利⽤空间分割结构,如果不在同⼀个⼦树内的物体不可能相交不⽤去计算, 在同⼀个⼦树内的物体被放⼊ overlapping pair, 再进⼀步由对应的算法来计算出接触点等信息. 采⽤哪⼀种算法取决于算法配置矩阵(见 bullet ⼿册)Narrow Phase: 根据 overlapping pairs 的分布情况计算出碰撞对象岛(collision Island).⽽后依次对各个岛进⾏约束分析. 亦即碰撞响应. Bullet 采⽤的是 Sequential Impulse ConstraintSolver( ) 约束分析是⼀个⾮常复杂的话题,涉及到 PGS 算法的简化,后⽂会有介绍. 约束分析会根据所设定的约束类型来计算碰撞后各个对象所对应的位置,速度等,然后与渲染引擎同步 motion state.碰撞响应相关资料⽹页1. Bullet HelloWorld2. 不完全指南3. ⼯作流程简析,推荐了相应书⽬4. 内容⽐较多的介绍5. 创建世界(场景)及常见函数6. 常见物体和初始化7. 物体碰撞与属性简单实例8. 三种碰撞检测及实现9. 刚体与软体的碰撞10. Bullet 约束的使⽤11. Bullet 通过⾼度图数据创建 3D 地形12. Bullet 3D Max 插件13. 在 OpenGL 中的应⽤教材包含了各种物理引擎的资料快速⼊门教程《游戏物理引擎开发》: 讲述了物理引擎的设计⽅法,实现了⼀个简单的物理引擎 cyclone.物理建模和仿真的⼤学课程,只有演⽰⽂稿和参考⽂献《Learning Game Physics with Bullet Physics and OpenGL》视频在 Maya 中使⽤ Bullet 引擎如何从头实现⼀个物理引擎Date: [2018-10-25 Thu 14:05]Author: fhlnCreated: 2018-10-25 Thu 19:02。
3D游戏开发技术的使用技巧解析随着科技的发展和电子游戏市场的繁荣,3D游戏愈发受到玩家的喜爱。
为了设计和制作出高质量的3D游戏,开发者需要掌握一系列的技术和技巧。
本文将介绍一些3D游戏开发中常用的技术,并解析其使用技巧。
1. 渲染技术在3D游戏开发中,渲染技术是至关重要的一部分。
它涉及到如何将3D模型和纹理呈现在屏幕上,并给玩家带来逼真的视觉效果。
一种常用的渲染技术是光栅化技术,它将3D模型转化为像素,然后通过光照等处理使其呈现出真实感。
开发者需要注意设置适当的光照、阴影和材质,以达到更好的渲染效果。
2. 输入处理技术3D游戏通常需要处理多样化的玩家输入,如鼠标、键盘和手柄等。
为了提供良好的游戏体验,开发者需要灵活使用输入处理技术。
一种常用的技术是事件驱动编程,通过监听和处理用户的输入事件来响应玩家操作。
开发者可以根据游戏的需要设计合适的输入响应机制,使玩家能够自如地操控游戏角色。
3. 物理模拟技术在现实世界中,物体之间存在着各种物理规律,如重力、碰撞等。
为了实现真实的物理效果,开发者需要掌握物理模拟技术。
一种常用的物理引擎是Box2D,它能够模拟出物体的运动和碰撞效果。
开发者可以根据游戏需求来调整物理参数,以达到更好的游戏体验。
4. UI设计技巧用户界面(UI)是玩家与游戏进行交互的重要组成部分。
对于3D游戏开发者来说,设计出合适的UI是至关重要的。
一种有效的UI设计技巧是使用层叠样式表(CSS)来创建交互式UI元素。
开发者可以通过调整样式、布局和动画效果来增强用户体验,并提供直观的操作方式。
5. 音效处理技术音效是3D游戏中不可或缺的一部分,能够增强游戏的沉浸感。
开发者需要掌握音效处理技术,以实现丰富的音效效果。
一种常见的处理技术是立体声音效处理,通过调整声源的位置、距离和方向,使玩家能够获得更真实的听觉体验。
开发者可以利用音频编辑工具和库来制作和管理游戏中的音效。
6. 性能优化技巧3D游戏通常需要处理大量的数据和复杂的计算。
ODE碰撞检测专题一、Delta3D中碰撞检测Delta3D中碰撞检测部分是通过融合了ODE实现的,ODE,全称:Open Dynamics Engine,一种开源的物理引擎。
二、碰撞检测背景知识碰撞检测在3D游戏中至关重要,好的碰撞检测要求人物在场景中可以平滑移动,遇到一定高度内的台阶可以自动上去,而过高的台阶则把人挡住,遇到斜率较小的斜坡可以上去,斜率过大则把人挡住,在各种前进方向被挡住的情况下都要尽可能地让人物沿合理的方向滑动而不是被迫停下。
在满足这些要求的同时还要做到足够精确和稳定,防止人物在特殊情况下穿墙而掉出场景。
早期3D游戏的碰撞检测多数基于格子或者BSP树(BSP树就是用来对N维空间中的元素进行排序和查找的二叉树。
),基于格子的系统实现简单但精度不够,不属于严格意义的3D碰撞检测。
基于BSP树的碰撞检测一度十分流行,算法基本已经成熟定型,但它的固有缺点却使它不太适合现在的游戏。
BSP树需要很长的预处理时间不适合加载时计算,BSP 划分经常会产生原多边形数三到四倍的多边形,考虑到不用保存法线、颜色、uv等信息也要增加将近一倍的资源容量,在一个大的游戏中将模型资源的容量从200M增加到400M相信是大部分人都不愿接受的。
目前对于任意复杂三角形集合(mesh)的碰撞检测多数基于BVTree(bounding volume tree)(BVTree,中文称包围盒树,有一种算法称包围盒算法,包围盒算法是一种求解离散点集最优包围空间的方法。
最常见的包围盒算法有AABB (Axis-aligned bounding box),Sphere,OBB(Oriented bounding box 面向包围盒)以及FDH(Fixed directions hulls 固定方向凸包)。
AABB(轴向包围盒)是应用最早的包围盒,构造比较简单,存储空间小,但紧密性差,尤其对不规则几何形体,冗余空间很大。
FDH是一种特殊的凸包,继承了AABB简单性的特点,但其要具备良好的空间紧密度,必须使用足够多的固定方向。
3D技术的原理3D技术是指通过模拟真实世界的三维空间,并以此为基础创建虚拟对象或场景的技术。
它主要通过感知和模拟人眼视觉机制来实现。
3D技术在许多领域得到应用,如电影、游戏、建筑设计等。
下面将详细介绍3D技术的原理。
一、人眼视觉机制要理解3D技术的原理,我们首先需要了解人眼的视觉机制。
人眼通过两只眼睛同时观察物体,每只眼睛看到的画面略有不同。
这种略微的差异通过大脑进行处理,从而让我们感知到深度和立体效果。
二、立体成像原理3D技术就是利用立体成像原理来模拟这种人眼立体视觉效果。
立体成像可以分为主动式和被动式两种方式。
1. 主动式立体成像主动式立体成像是指通过特殊的眼镜或其他装置来实现立体效果。
这种方法要求观众佩戴特殊的眼镜,其中一只眼镜会屏蔽或过滤掉画面中的特定部分。
当观众通过这种眼镜观看画面时,两只眼睛会看到不同的画面,从而产生立体效果。
常见的主动式立体成像技术包括偏振成像、快门式成像和红蓝绿成像。
其中,偏振成像是利用偏光片来过滤不同方向的光线,使得观众通过左眼和右眼看到的画面有所差异;快门式成像是通过快速切换显示左右两个画面的方式,要求观众佩戴配对眼镜,左眼只能看到左画面,右眼只能看到右画面;红蓝绿成像则是通过过滤红色、蓝色和绿色光线的方式,使得观众通过左右眼分别看到不同颜色的画面。
2. 被动式立体成像被动式立体成像是指无需佩戴特殊眼镜,通过分别投射不同图像给左右眼来实现立体效果。
常见的被动式立体成像技术有自动立体成像和云台立体成像。
自动立体成像是利用特殊的光栅片或面板将左右眼的图像进行分离并分别投射给左右眼。
观众无需佩戴任何眼镜,就可以通过裸眼观看画面,获得立体效果。
云台立体成像是通过将左右眼的图像投射到偏振滤光器上,观众佩戴带有偏振滤光器的眼镜,通过不同的滤光器过滤掉其中的一种偏振光,从而实现不同眼睛看到不同的画面。
这种技术多用于电影院等特定场合。
三、3D建模和渲染除了立体成像之外,3D技术还需要进行3D建模和渲染。
动捕bvh数据结构【原创实用版】目录1.BVH 数据结构的概念2.BVH 数据结构的主要特点3.BVH 数据结构的应用领域4.BVH 数据结构的优缺点正文1.BVH 数据结构的概念BVH(Binary Volume Hierarchy)数据结构,即二叉体积层次结构,是一种基于二叉树的数据结构,主要用于处理三维空间中的物体运动捕捉数据。
BVH 结构将物体表面分解成许多小的三角形,通过对这些三角形的运动捕捉,可以获取物体在三维空间中的运动轨迹。
2.BVH 数据结构的主要特点BVH 数据结构具有以下主要特点:(1)层次结构:BVH 结构采用二叉树的形式,将物体表面分解成不同层次的三角形,这种层次结构有利于提高数据处理的效率。
(2)快速查询:BVH 结构通过层次结构,可以快速查询物体表面的运动轨迹,这对于实时动画制作等领域具有重要意义。
(3)精确度:BVH 结构通过对物体表面的细分,可以获得较高的运动捕捉精确度。
(4)存储空间:BVH 结构所需的存储空间相对较小,因为它只存储物体表面的关键点信息,而不需要存储整个物体的详细信息。
3.BVH 数据结构的应用领域BVH 数据结构广泛应用于以下领域:(1)动画制作:在三维动画制作中,BVH 数据结构可以实现精确的运动捕捉,提高动画的质量和制作效率。
(2)虚拟现实:在虚拟现实技术中,BVH 数据结构可以用于模拟物体在虚拟空间中的运动,提高用户体验。
(3)机器人学:在机器人学领域,BVH 数据结构可以用于描述机器人的运动轨迹,实现精确的控制。
4.BVH 数据结构的优缺点BVH 数据结构的优点包括:(1)高效的查询速度:BVH 结构通过层次结构,可以快速查询物体表面的运动轨迹。
(2)较高的精确度:BVH 结构通过对物体表面的细分,可以获得较高的运动捕捉精确度。
(3)存储空间较小:BVH 结构所需的存储空间相对较小,因为它只存储物体表面的关键点信息。
BVH 数据结构的缺点包括:(1)结构复杂:BVH 结构采用二叉树的形式,结构相对复杂,需要一定的计算资源来维护。
本书是游戏编程畅销书作者André LaMothe的扛鼎之作,从游戏编程和软件引擎的角度深入探讨了3D图形学的各个重要主题。
全书共分5部分,包括16章的内容。
第1~3章简要地介绍了Windows和DirectX 编程,创建了一个Windows应用程序模板,让读者能够将精力放在游戏逻辑和图形实现中,而不用考虑Windows和DirectX方面的琐事;第4~5章简要地介绍了一些数学知识并实现了一个数学库,供以后编写演示程序时使用;第6章概述了3D图形学,让读者对本书将介绍的内容有大致的了解;第7~11章分别介绍了光照、明暗处理、仿射纹理映射、3D裁剪和深度缓存等内容;第12~14章讨论了高级3D渲染技术,包括透视修正纹理映射、Alpha混合、1/z缓存、纹理滤波、空间划分和可见性算法、阴影、光照映射等;第15~16章讨论了动画、运动碰撞检测和优化技术。
本书适合于有一定编程经验并想从事游戏编程工作或对3D图形学感兴趣的人员阅读。
作者:拉莫泽译者目录:第一部分3D游戏编程简介第1章3D游戏编程入门21.1简介21.22D/3D游戏的元素31.2.1初始化31.2.2进入游戏循环31.2.3读取玩家输入41.2.4执行AI和游戏逻辑41.2.5渲染下一帧41.2.6同步显示41.2.7循环41.2.8关闭51.3通用游戏编程指南71.4使用工具91.4.13D关卡编辑器121.4.2使用编译器131.5一个3D游戏范例:Raiders 3D151.5.1事件循环331.5.2核心3D游戏逻辑341.5.33D投影351.5.4星空361.5.5激光炮和碰撞检测371.5.6爆炸371.5.7玩Raiders3D371.6总结37第2章Windows和DirectX简明教程382.1Win32编程模型382.2Windows程序的最小需求392.3一个基本的Windows应用程序432.3.1Windows类432.3.2注册Windows类472.3.3创建窗口472.3.4事件处理程序482.3.5主事件循环522.3.6构建实时事件循环552.4DirectX和COM简明教程562.4.1HEL和HAL572.4.2DirectX基本类582.5COM简介592.5.1什么是COM对象602.5.2创建和使用DirectX COM接口612.5.3查询接口622.6总结64第3章使用虚拟计算机进行3D游戏编程653.1虚拟计算机接口简介653.2建立虚拟计算机接口663.2.1帧缓存和视频系统663.2.2使用颜色703.2.3缓存交换713.2.4完整的虚拟图形系统733.2.5I/O、声音和音乐733.3T3DLIB游戏控制台743.3.1T3DLIB系统概述743.3.2基本游戏控制台743.4T3DLIB1库793.4.1DirectX图形引擎体系结构793.4.2基本常量793.4.3工作宏813.4.4数据类型和结构813.4.5函数原型843.4.6全局变量883.4.7DirectDraw接口893.4.82D多边形函数923.4.9数学函数和错误函数973.4.10位图函数993.4.118位调色板函数1023.4.12实用函数1043.4.13BOB(Blitter对象)引擎1063.5T3DLIB2 DirectX输入系统1123.6T3DLIB3声音和音乐库1163.6.1头文件1173.6.2类型1173.6.3全局变量1173.6.4DirectSound API封装函数1183.6.5DirectMusic API封装函数1213.7建立最终的T3D游戏控制台1243.7.1映射真实图形到虚拟接口的非真实图形124 3.7.2最终的T3DLIB游戏控制台1263.8范例T3LIB应用程序1343.8.1窗口应用程序1343.8.2全屏应用程序1353.8.3声音和音乐1363.8.4处理输入1363.9总结139第二部分3D数学和变换第4章三角学、向量、矩阵和四元数1424.1数学表示法1424.22D坐标系1434.2.12D笛卡尔坐标1434.2.22D极坐标1444.33D坐标系1474.3.13D笛卡尔坐标1474.3.23D柱面坐标1494.3.33D球面坐标1504.4三角学1514.4.1直角三角形1514.4.2反三角函数1534.4.3三角恒等式1534.5向量1544.5.1向量长度1554.5.2归一化1554.5.3向量和标量的乘法1554.5.4向量加法1564.5.5向量减法1574.5.6点积1574.5.7叉积1594.5.8零向量1604.5.9位置和位移向量1604.5.10用线性组合表示的向量161 4.6矩阵和线性代数1614.6.1单位矩阵1624.6.2矩阵加法1634.6.3矩阵的转置1634.6.4矩阵乘法1644.6.5矩阵运算满足的定律165 4.7逆矩阵和方程组求解1654.7.1克来姆法则1674.7.2使用矩阵进行变换1684.7.3齐次坐标1694.7.4应用矩阵变换1704.8基本几何实体1764.8.1点1764.8.2直线1764.8.3平面1794.9使用参数化方程1824.9.12D参数化直线1824.9.23D参数化直线1844.10四元数简介1894.10.1复数理论1894.10.2超复数1934.10.3四元数的应用1974.11总结200第5章建立数学引擎2015.1数学引擎概述2015.1.1数学引擎的文件结构2015.1.2命名规则2025.1.3错误处理2035.1.4关于C++的最后说明2035.2数据结构和类型2035.2.1向量和点2035.2.2参数化直线2045.2.33D平面2065.2.4矩阵2065.2.5四元数2095.2.6角坐标系支持2105.2.72D极坐标2105.2.83D柱面坐标2115.2.93D球面坐标2115.2.10定点数2125.3数学常量2135.4宏和内联函数2145.4.1通用宏2185.4.2点和向量宏2185.4.3矩阵宏2195.4.4四元数2205.4.5定点数宏2215.5函数原型2215.6全局变量2245.7数学引擎API清单2255.7.1三角函数2255.7.2坐标系支持函数2265.7.3向量支持函数2285.7.4矩阵支持函数2355.7.52D和3D参数化直线支持函数245 5.7.63D平面支持函数2485.7.7四元数支持函数2525.7.8定点数支持函数2595.7.9方程求解支持函数2635.8浮点单元运算初步2655.8.1FPU体系结构2665.8.2FPU堆栈2665.8.3FPU指令集2685.8.4经典指令格式2705.8.5内存指令格式2715.8.6寄存器指令格式2715.8.7寄存器弹出指令格式2715.8.8FPU范例2715.8.9FLD范例2725.8.10FST范例2725.8.11FADD范例2735.8.12FSUB范例2755.8.13FMUL范例2765.8.14FDIV范例2785.9数学引擎使用说明2795.10关于数学优化的说明2805.11总结280第6章3D图形学简介2826.13D引擎原理2826.23D游戏引擎的结构2826.2.13D引擎2836.2.2游戏引擎2836.2.3输入系统和网络2846.2.4动画系统2846.2.5碰撞检测和导航系统2876.2.6物理引擎2886.2.7人工智能系统2896.2.83D模型和图像数据库2896.33D坐标系2916.3.1模型(局部)坐标2916.3.2世界坐标2936.3.3相机坐标2966.3.4有关相机坐标的说明3026.3.5隐藏物体(面)消除和裁剪3036.3.6透视坐标3086.3.7流水线终点:屏幕坐标3156.4基本的3D数据结构3216.4.1表示3D多边形数据时需要考虑的问题322 6.4.2定义多边形3236.4.3定义物体3276.4.4表示世界3306.53D工具3316.6从外部加载数据3326.6.1PLG文件3336.6.2NFF文件3356.6.33D Studio文件3386.6.4Caligari COB文件3436.6.5Microsoft DirectX .X文件3456.6.63D文件格式小结3456.7基本刚性变换和动画3456.7.13D平移3456.7.23D旋转3466.7.33D变形3476.8再看观察流水线3486.93D引擎类型3496.9.1太空引擎3496.9.2地形引擎3506.9.3FPS室内引擎3516.9.4光线投射和体素引擎3526.9.5混合引擎3536.10将各种功能集成到引擎中3536.11总结353第7章渲染3D线框世界3547.1线框引擎的总体体系结构3547.1.1数据结构和3D流水线3557.1.2主多边形列表3577.1.3新的软件模块3597.2编写3D文件加载器3597.3构建3D流水线3677.3.1通用变换函数3677.3.2局部坐标到世界坐标变换3727.3.3欧拉相机模型3757.3.4UVN相机模型3777.3.5世界坐标到相机坐标变换3877.3.6物体剔除3907.3.7背面消除3937.3.8相机坐标到透视坐标变换3957.3.9透视坐标到屏幕(视口)坐标变换3997.3.10合并透视变换和屏幕变换4037.4渲染3D世界4057.53D演示程序4087.5.1单个3D三角形4087.5.23D线框立方体4117.5.3消除了背面的3D线框立方体4137.5.43D坦克演示程序4147.5.5相机移动的3D坦克演示程序4167.5.6战区漫步演示程序4187.6总结421第三部分基本3D渲染第8章基本光照和实体造型4248.1计算机图形学的基本光照模型4248.1.1颜色模型和材质4268.1.2光源类型4328.2三角形的光照计算和光栅化4378.2.1为光照做准备4418.2.2定义材质4428.2.3定义光源4458.3真实世界中的着色4498.3.116位着色4498.3.28位着色4508.3.3一个健壮的用于8位模式的RGB模型4508.3.4一个简化的用于8位模式的强度模型4538.3.5固定着色4578.3.6恒定着色4598.3.7Gouraud着色概述4728.3.8Phong着色概述4748.4深度排序和画家算法4758.5使用新的模型格式4798.5.1分析器类4798.5.2辅助函数4828.5.33D Studio MAX ASCII格式.ASC4848.5.4TrueSpace ASCII.COB格式4868.5.5Quake II二进制.MD2格式概述4948.63D建模工具简介4958.7总结497第9章插值着色技术和仿射纹理映射4989.1新T3D引擎的特性4989.2更新T3D数据结构和设计4999.2.1新的#defines4999.2.2新增的数学结构5019.2.3实用宏5029.2.4添加表示3D网格数据的特性5039.2.5更新物体结构和渲染列表结构5089.2.6函数清单和原型5119.3重新编写物体加载函数5179.3.1更新.PLG/PLX加载函数5179.3.2更新3D Studio .ASC加载函数5279.3.3更新Caligari .COB加载函数5289.4回顾多边形的光栅化5329.4.1三角形的光栅化5329.4.2填充规则5359.4.3裁剪5379.4.4新的三角形渲染函数5389.4.5优化5429.5实现Gouraud着色处理5439.5.1没有光照时的Gouraud着色5449.5.2对使用Gouraud Shader的多边形执行光照计算553 9.6基本采样理论5609.6.1一维空间中的采样5609.6.2双线性插值5619.6.3u和v的插值5639.6.4实现仿射纹理映射5649.7更新光照/光栅化引擎以支持纹理5669.8对8位和16位模式下优化策略的最后思考571 9.8.1查找表5719.8.2网格的顶点结合性5729.8.3存储计算结果5729.8.4SIMD5739.9最后的演示程序5739.10总结576第10章3D裁剪57710.1裁剪简介57710.1.1物体空间裁剪57710.1.2图像空间裁剪58010.2裁剪算法58110.2.1有关裁剪的基本知识58110.2.2Cohen-Sutherland裁剪算法58510.2.3Cyrus-Beck/梁友栋-Barsky裁剪算法586 10.2.4Weiler-Atherton裁剪算法58810.2.5深入学习裁剪算法59010.3实现视景体裁剪59110.3.1几何流水线和数据结构59210.3.2在引擎中加入裁剪功能59310.4地形小议61110.4.1地形生成函数61210.4.2生成地形数据61910.4.3沙地汽车演示程序61910.5总结623第11章深度缓存和可见性62411.1深度缓存和可见性简介62411.2z缓存基础62611.2.1z缓存存在的问题62711.2.2z缓存范例62711.2.3平面方程法63011.2.4z坐标插值63111.2.5z缓存中的问题和1/z缓存63211.2.6一个通过插值计算z和1/z的例子63311.3创建z缓存系统63511.4可能的z缓存优化64911.4.1使用更少的内存64911.4.2降低清空z缓存的频率65011.4.3混合z缓存65111.5z缓存存在的问题65111.6软件和z缓存演示程序65211.6.1演示程序I:z缓存可视化65211.6.2演示程序II:Wave Raider65311.7总结658第四部分高级3D渲染第12章高级纹理映射技术66012.1纹理映射——第二波66012.2新的光栅化函数66712.2.1最终决定使用定点数66712.2.2不使用z缓存的新光栅化函数668 12.2.3支持z缓存的新光栅化函数67012.3使用Gouruad着色的纹理映射671 12.4透明度和alpha混合67712.4.1使用查找表来进行alpha混合678 12.4.2在物体级支持alpha混合功能688 12.4.3在地形生成函数中加入alpha支持69412.5透视修正纹理映射和1/z缓存69612.5.1透视纹理映射的数学基础69612.5.2在光栅化函数中加入1/z缓存功能702 12.5.3实现完美透视修正纹理映射70712.5.4实现线性分段透视修正纹理映射710 12.5.5透视修正纹理映射的二次近似714 12.5.6使用混合方法优化纹理映射71812.6双线性纹理滤波71912.7Mipmapping和三线性纹理滤波724 12.7.1傅立叶分析和走样简介72512.7.2创建Mip纹理链72712.7.3选择mip纹理73412.7.4三线性滤波73912.8多次渲染和纹理映射74012.9使用单个函数来完成渲染工作74112.9.1新的渲染场境74112.9.2设置渲染场境74312.9.3调用对渲染场境进行渲染的函数74512.10总结753第13章空间划分和可见性算法75413.1新的游戏引擎模块75413.2空间划分和可见面判定简介75413.3二元空间划分75713.3.1平行于坐标轴的二元空间划分75813.3.2任意平面空间划分75913.3.3使用多边形所在的平面来划分空间76013.3.4显示/访问BSP树中的每个节点76213.3.5BSP树数据结构和支持函数76313.3.6创建BSP树76513.3.7分割策略76713.3.8遍历和显示BSP树77513.3.9将BSP树集成到图形流水线中78413.3.10BSP关卡编辑器78513.3.11BSP的局限性79313.3.12使用BSP树的零重绘策略79413.3.13将BSP树用于剔除79513.3.14将BSP树用于碰撞检测80213.3.15集成BSP树和标准渲染80213.4潜E.5微软公司的Direct X 多媒体展示?80813.4.2潜在可见集的其他编码方法809 13.4.3流行的PVS计算方法81013.5入口81113.6包围体层次结构和八叉树81313.6.1使用BHV树81513.6.2运行性能81613.6.3选择策略81713.6.4实现BHV81813.6.5八叉树82513.7遮掩剔除82513.7.1遮掩体82613.7.2选择遮掩物82613.7.3混合型遮掩物选择方法82713.8总结827第14章阴影和光照映射82814.1新的游戏引擎模块82814.2概述82814.3简化的阴影物理学82914.4使用透视图像和广告牌来模拟阴影83214.4.1编写支持透明功能的光栅化函数83314.4.2新的库模块83514.4.3简单阴影83714.4.4缩放阴影83914.4.5跟踪光源84114.4.6有关模拟阴影的最后思考84414.5平面网格阴影映射84514.5.1计算投影变换84514.5.2优化平面阴影84814.6光照映射和面缓存技术简介84814.6.1面缓存技术85014.6.2生成光照图85014.6.3实现光照映射函数85114.6.4暗映射(dark mapping)85314.6.5光照图特效85414.6.6优化光照映射代码85414.7整理思路85414.8总结854第五部分高级动画、物理建模和优化第15章3D角色动画、运动和碰撞检测85815.1新的游戏引擎模块85815.23D动画简介85815.3Quake II .MD2文件格式85915.3.1.MD2文件头86115.3.2加载Quake II .MD2文件86815.3.3使用.MD2文件实现动画87415.3.4.MD2演示程序88215.4不基于角色的简单动画88315.4.1旋转运动和平移运动88315.4.2复杂的参数化曲线移动88515.4.3使用脚本来实现运动88515.53D碰撞检测88715.5.1包围球和包围圆柱88715.5.2使用数据结构来提高碰撞检测的速度88815.5.3地形跟踪技术88915.6总结890第16章优化技术89116.1优化技术简介89116.2使用Microsoft Visual C++和Intel VTune剖析代码892 16.2.1使用Visual C++进行剖析89216.2.2分析剖析数据89316.2.3使用VTune进行优化89416.3使用Intel C++编译器89916.3.1下载Intel的优化编译器90016.3.2使用Intel编译器90016.3.3使用编译器选项90116.3.4手工为源文件选择编译器90116.3.5优化策略90216.4SIMD编程初步90216.4.1SIMD基本体系结构90316.4.2使用SIMD90316.4.3一个SIMD 3D向量类91216.5通用优化技巧91816.5.1技巧1:消除_ftol()91816.5.2技巧2:设置FPU控制字91816.5.3技巧3:快速将浮点变量设置为零91916.5.4技巧4:快速计算平方根91916.5.5技巧5:分段线性反正切92016.5.6技巧6:指针递增运算92016.5.7技巧7:尽可能将if语句放在循环外面92116.5.8技巧8:支化(branching)流水线92116.5.9技巧9:数据对齐92116.5.10技巧10:将所有简短函数都声明为内联的92216.5.11参考文献92216.6总结922第六部分附录附录A光盘内容简介CD: 924附录B安装DirectX和使用Visual C/C++CD: 925B.1安装DirectXCD: 925B.2使用Visual C/C++编译器CD: 925B.3编译提示CD: 926附录C三角学和向量参考CD: 927C.1三角学CD: 927C.2向量CD: 929C.2.1向量长度CD: 930C.2.2归一化CD: 930C.2.3标量乘法CD: 930C.2.4向量加法CD: 931C.2.5向量减法CD: 931C.2.6点积CD: 932C.2.7叉积CD: 933C.2.8零向量CD: 934C.2.9位置向量CD: 934C.2.10向量的线性组合CD: 934附录DC++入门CD: 935D.1C++是什么CD: 935D.2必须掌握的C++知识CD: 937D.3新的类型、关键字和约定CD: 937D.3.1注释符CD: 937D.3.2常量CD: 937D.3.3引用型变量CD: 938D.3.4即时创建变量CD: 938D.4内存管理CD: 939D.5流式输入/输出CD: 939D.6类CD: 941D.6.1新结构CD: 941D.6.2一个简单的类CD: 942D.6.3公有和私有CD: 942D.6.4类的成员函数(方法)CD: 943D.6.5构造函数和析构函数CD: 944D.6.6编写构造函数CD: 945D.6.7编写析构函数CD: 946D.7域运算符CD: 947D.8函数和运算符重载CD: 948D.9基本模板CD: 950D.10异常处理简介CD: 951D.11总结CD: 954附录E游戏编程资源CD: 955E.1游戏编程和新闻网站CD: 955E.2下载站点CD: 955E.32D/3D引擎CD: 956E.4游戏编程书籍CD: 956E.5微软公司的Direct X 多媒体展示CD: 956 E.6新闻组CD: 957E.7跟上行业的步伐CD: 957E.8游戏开发杂志CD: 957E.9Quake资料CD: 957E.10免费模型和纹理CD: 957E.11游戏网站开发者CD: 957附录FASCII码表CD: 959。
3D游戏中的BSP 二叉空间分割 技术 BSP(二叉空间分割)树是另一种类型的空间分割技术,其已经在游戏产业上应用了很多年(Doom是第一个使用BSP树的贸易游戏).尽管在今天BSP树已经没像过往那么受欢迎了,但现在仍在广泛地采用这项技术.
当你看一下BSP在碰撞检测方面那极度干净漂亮和高速的效率,立即能让你眼前一亮.不但BSP树在多边形剪切方面表现出色,而且还能让我们有效地自由运用world-object式的碰撞检测.BSP树的遍历是使用BSP的一个基本技术.碰撞检测本质上减少了树的遍历或搜索.这种方法很有用由于它能在早期排除大量的多边形,所以在最后我们仅仅是对少数面进行碰撞检测.正如我前面所说的,用找出两个物体间的分隔面的方法适合于判定两个物体是否相交.假如分隔面存在就没有发生碰撞.因此我们递回地遍历world树并判定分割面是否和包围球或包围盒相交.我们还可以通过检测每一个物体的多边形来进步精确度.进行这种检测最简单的一个方法是测试看看物体的所有部分是否都在分割面的一侧.这种运算真的很简单,我们用迪卡尔平面等式ax+by+cz+d=0往判定点位于平面的哪一侧.假如满足等式,点在平面上;假如ax+by+cz+d 0那么点在平面的正面;假如ax+by+cz+d 0点在平面的背面.
在碰撞没发生的时候有一个重要的事情需要留意,就是一个物体(或它的包围盒)必须在分割面的正面或背面.假如在平面的正面和背面都有顶点,说明物体与这个平面相交了.(以上载选自百度百科)
Bsp分割算法简述 Preview BSP分割算法也是有不少文章可以鉴戒的,就我目前能把握的资料来看,泛泛而谈者大有人在,实际往作的时候却总是抓瞎.知道是什么永远不如知道怎么做,BSP分割是BSP分析的基础,固然它很简单,但是,假如连简单的都不会做,又怎么能胜任复杂的工作呢? 趁这段时间有空,遂埋头钻研BSP,一周之后,分割和自动Portal天生均已解决,遂做此文,希看能对初学者有所帮助,亦希看能抛砖引玉,众位高手能不吝赐教.
本文先就BSP中相对简单的分割部分做一个简单的先容,自动Portal天生的资料正在整理,希看能尽快放出.
BSP的基本原理 试想我们生活的空间,肯定是由为数众多的天花板、墙壁和地板组成,对于每一个"板",都将空间分为"板前"和"板后"两个部分.已知人的位置,就可根据人在"板前"还是在"板后",知道人所能看到的物体的遮挡顺序(e.g.假如人在板前,则板前的物体遮挡所有板后的物体).
BSP者,原理很简单:它试图将所有的板(在BSP中叫做平面)组织成一棵树,每个平面均将它所在的空间分割为前后两个部分,这两个部分又分别被另外的平面分割成更小的空间hh直到最后,按照前面所说的算法,确定每一个房间(在BSP中叫做叶子)相对于眼睛的遮挡顺序.
这是一个非常标准的二分法,仅按照"前"和"后"两个逻辑上的概念来切分空间家长为给孩子争取进园名额排队等候一夜(图),这使得它在以"房间"为单位组成的室内场景里是不二之选.为什么?请接着看:
在判定遮挡顺序的时候,BSP空间的算法极为简单:只需要从树根开始,简单判定人的位置与所有平面的前后关系:前则正子树(在平面"前"方的空间)在前,负子树(在平面"后"方的空间)在后;后则正子树在后,负子树在前.以此递回到叶子(叶子总是一个房间),就可以确定人处于哪一个房间之中、其他房间的遮挡关系如何.
这个实在很简单:由于所有的平面均将其所处的空间分为前后两个部分,所以,每一个房间,均是由若干平面的"前""后"来决定的,通过人与这些平眼前后关系的判定,自然而然就可以直接定位到所需的房间之中了.这就是BSP算法的特别之处. 如图:空间ABC由A、B、C三个独立的房间组成,首先,分割平面1将空间分成了平面正向的A房间和平面负向的BC空间,BC空间被2紧接着分割为平面2正向的C房间和负向的B房间.留意这里平面的方向一般由墙壁面向的方向而定.
假如有一个人处于C房间内,那么如何判定所有房间的遮挡顺序呢?从树根开始,由于人处于平面1的"后"面,所以,BC空间应该先于A房间(后:先负后正),然后,由于人处于分割平面2的"前"面,所以,C房间应该先于B房间(前:先正后负).这样,整个房间离人由近到远的顺序就可以确定了:C-B-A.仅需要通过两次平面的前后判定(总共六次乘法、两次加法、两次大小判定),就可以确定空间的先后顺序,算法的威力可见一斑!
BSP分割的目标是将空间划分为一个个叶凸体,也就是一个凸面体.一个个凸面体才有排序的可能,很难想象一个非凸面体在空间中如何排序.如图左:从箭头方向看过往,到底凹多面体A是在B的前面?还是B在凹多面体A的前面?而假如是右边的,两个凸多面体,情况就不一样了,A和B方向的前后,根据视点的位置永远是唯一的.这就是BSP的上风,只需要知道视点的位置,空间所有凸体的位置顺序都可以马上确定,但假如是凹体,对不起,那就确定不了了,所以,BSP划分空间结构化面的结果必然是一个个凸面体.
这里?*ㄒ幌肟浯蟮囊坏闶?假如您分析过Quake3的BSP格式,那么您会发现过往有时候一个房间会被几个柱子分割得乱七八糟,只是为了少渲染几个面.现在大不必这么调兵遣将,一个房间就留外面的6个结构化面,柱子什么的只算作细节Mesh,不参与分割,这样产生的结果,与Portal筛选结合之后,效率未必就差.而且,结构更符合逻辑,在以后自动路点和路径计算的时候,会有一些上风.想想看,被一个很不规则的柱子(或箱子等其他物体)划分得乱七八糟的空间,一个房间就有很多个叶子,到底哪些叶子是人能走到的?哪些叶子是人走不到的?哪些叶子需要在AI中被考虑?哪些叶子可以排除?一个不以逻辑构成的空间,必然在逻辑的处理上要处处碰壁.所以,最好还是一个叶子就是一个房间、或者一个走廊;柱子、箱子啊什么的全都用细节Mesh,就可以了.
留意北京美的燃气灶维修团中心追授舍己救人大学生优秀共青团员称号,BSP划分出的凸体实在主要是为了后面BSP分析而进行的,而不是渲染.早先的时候硬件很糟糕,没有Z缓冲,那时候省一个三角形比现在重要得多.现在?有时候宁可多画一堆三角形也不会往浪费那个CPU资源进行三角形的逐个筛选.所以,尽量减少结构化面,使结构化面的房间组成凸体,但细节面把房间装点成什么样那就无所谓了,即便细节面将这个空间又变成了一个凹体,也是无所谓的10余工友夜顶冷风帮助断指工人找回无名指,如图:
由于是一个老算法了,因此BSP分割算法早已经不是什么神秘的东西,这个算法有很多例子,推荐《BSP技术详解》(翻译后的名称如此),唯一的遗憾是这篇文章的伪代码需要花点心思.另外,《3D游戏卷2动画与高级实时渲染技术》所带的FLY 3D引擎也有很完整的代码,固然整个看下来比伪代码还难懂,但是每个函数基本上都还算清楚,也是一个难得的备选资料.
当然,可能大部分人还是倾向于往看Quake和HL2的代码.为了使自己加深印象,我所选择的是自己从零开始,仅按照资料上的观点和流程进行DIY,而没有参考代码.由于经常参考着、雪纺衫左旋肉碱参考着就"拿来主义"了,固然开发效率保证了,但是记性不清,一旦扩展起来,基本抓瞎^_^b.所以这次狠狠心,决定享受一次DIY的乐趣.
预备工作:场景数据 进进工作状态,第一个题目是场景数据的配置.BSP的难度一定程度上不是算法本身带来的,BSP算法很简单也很明确,并没有太多复杂的东西在里面.复杂的是大凡好的BSP都需要和编辑器结合起来,以进行Portal、Brush、Entity和Path Point诸如此类的定制,直接从3D Max导出一个Mesh然后就进行分析,这个从实践上限终公多、意义不大,所以,与其说BSP分割很难,倒不如说是BSP的编辑器难做.记得一本老书上曾经说过,BSP编辑器的代码是BSP分割算法的10倍有余仔细想想,确实如此,而且只会有过之而无不及.
在实践中我采用了《3D游戏》的方法,这个方法是北京美的空调维修,通过在3D Max中物体的名称来区分一个物体的这些面是属于"结构化面"(分割平面)、"细节面"(不参与分割的面)还是Entity.由于3D Max Script支持使用前缀将一组物体放进一个Array中,所以,使用一个简单而明确的前缀是一个很好的思路,《3D游戏》使用了*、&这些符号,而我则使用了S(Split)、D(Detail)、E(Entity).例如SBox01说明这个Box01的所有面均是结构化面,要参与BSP分割和分析,而DSphere01则说明这个Sphere01在BSP的分割和分析中将会被忽略.这中间的主要工作集中在3DMAX Script的撰写(或者插件的撰写),所以就不再多说了,对这个技术还比较生疏的,可以参考网上相关的内容.
从3DMAX中读出来Object后,其所有的顶点和面索引都已知了,将所有顶点组织成一个顶点表,所有的结构化三角形组织成一个结构化三角形表(这里的三角形是指顶点索引),这个比较简单,应该不是题目.
数据进进我们的程序,第一件事情就是要首先计算出所有的平面,由于不同的结构化面可能共用一个平面,所以,这里先需要计算出所有的平面并在平面和结构化面中建立关系,以防止同一个平面被两次以上使用,影响BSP二分逻辑的正确性.D3DX给出了专门的函数D3DXPlaneFromPoints,可以很方便地从一个三角形产生出一个平面来.一个新的平面算出来后,检查一下这个平面是否已经天生过了,假如没有,就算作一个新平面并记录其ID,否则就要舍弃这个新平面,转而采用原有平面的ID.直到最后,为所有的结构化三角形给出其对应的平面ID.这中间留意一下D3DX的平面公式是ax+by+cz+d=0,用的是+d,不是-d,在之后的计算中需要留意.
预备好顶点表、结构化三角形表和平面表之后,分割就可以正式开始了.相对于3DMax Script和插件而言,BSP分割的算法本身轻易得让人崩溃,未几说了,下面开始!
BSP分割 首先,自然是要先产生一个根节点,并把所有的顶点表、美容护肤热卖结构化三角形表和平面表一股脑塞进这个根节点中咯.
然后,分割的流程大抵如下: 1遍历当前节点的所有备选平面,寻找一个合适的分割平面. 2假如找不到合适的分割平面,这个节点是一个叶子,Return. 3假如找到了,Mark这个平面已经被使用过.