游戏世界中的向量计算

5 篇文章 0 订阅

前言

在游戏中,向量计算是少不了的,这是必须的,因为每一个物体都带有一个向量,这个向量在数值上等于他们的坐标,也就是Transform组件的position属性,其实position也可以看作一个向量,实际上,每个游戏物体的position就存储在一个Vector变量里。

什么是向量

向量,这是一个既有大小也有方向的量。也许会有人觉得很疑惑,为什么我在前言里说,物体的position也是一个向量,在大多数人看来,这就是一个坐标。其实不是这样,它也是一个向量,他的方向是从原点指向自身,大小是从自身到世界原点的距离,所以我这么说读者应该会理解,为什么说物体的position属性也是一个向量,这个依据不建立在它的值是存储在一个Vector变量里的。也许不熟悉的读者在这里会有点头晕,接下来我着重介绍向量的计算,通过对向量计算的介绍和讲解,去区分开坐标和向量的区别。

  • 向量的计算
    我们随即在世界中创建一个物体,就像这样:

在这里插入图片描述
为了能简单的说明问题,我这里取2D世界来做演示,并且忽略掉负半轴。

我们创建了一个A物体,他的坐标标识为(Xa, Ya);
那么怎么标识,他就是一个向量,(Xa - 0, Ya - 0);这就是它在世界空间中表示的向量,当然我这里不写出符号,这个已经是高中知识了。所以如果把A所在的位置看作一个向量,那么他的大小就是和世界原点的距离,方向是从世界原点指向自己,就是这样:
在这里插入图片描述
额。。。箭头没花完,,意思对就行哈。
所以我希望读者能理解我再开头说的话。这也是非常重要的。

  • 空间中任意两点的向量
    我们随机创建一个物体B:
    在这里插入图片描述
    老样子,物体B的坐标为(Xb, Yb);那么我们如何去计算一个有 B 指向 A 的向量,很简单,用 B 物体的坐标 - A 物体的坐标, 也就可以得出一个有 B 指向 A 的向量。
    也就是这样:

在这里插入图片描述

看到这里也许大部分读者会说这太简单了,自己经常用这个操作去计算和目标的方向。当然确实很简单,这两个物体坐标相减就好了,而且这种表示严格意义上来说他表示的向量不是 (Xa - Xb, Ya - Yb),他表示的其实是(Xa - Xb, Ya - Yb) + (Xb, Yb), 这点读者必须分清楚。

  • 基于向量的移动
    从理论上出发,我们可以得到一个结论,一个物体的坐标 + 一个向量 == 移动的物体,这肯定是没问题的,上面我们算出了,由 B 指向 A 的方向向量,接下来我们通过代码的形式,让 B 向 A 运动,下面是代码:
	Vector2 aPos;
	Vector2 bPos;
		
	void Move()
	{
		bPos = Normalize(aPos - bPos) + bPos;//一般情况下我们取方向的法向量,可以保持一个相对稳定速度的移动
	}

读者一定要明白为什么可以这么做,下面我讲解原因:
这很好理解, (Xa - Xb, Ya - Yb)得出的向量,你也以理解为一个标量,这时我们把这个向量拆开为两个 Float 类型的值,Xa - Xb 和 Ya - Yb, 当你不再把它看作一个向量的时候,他就是一个差值,Xa - Xb, 就是 A 物体和 B 物体之间的在 X 轴上的差, Y也一样,是在Y轴上的差,每次的更新,B 物体的坐标都会加上一个他们之间的差值,所以会实现一个移动的效果,这点很好理解,运用到3D世界中也是一样的。

也许你会觉得这是一个是个人都知道的东西,没什么好讲的,所以接下来我会讲一些我自己在项目中会使用到的实用计算。

标准正交基的构建

所谓标准正交基就是三个相互垂直的单位向量,最常见的标注正交基就是物体的3个坐标轴,X ,Y, Z,那么,如何在任意的角度去构建一个标准正交基呢?
还是一样。不过这次实在空间坐标中随机创建两个物体:
废话不多说直接上代码:

		Vector3 targetDir;
		Vector3 aPos;
		Vector3 bPos;
		void GetXYZ()
		{
			targetDir = Vector3.Normalize(aPos - bPos);
			//1
			Vector3 up = this.Step(0.99, targetDir.y) * Vector3.Up + (1 - this.Step(0.99f, targetDir)) * Vector3.forward;
			Vector3 right = Vector3.Normalize(Vector.Cross(up + targetDir));
			up = Vector3.Cross(right, targetDir);
			
			Debug.DrawRay(Vector3.zero, right, Color.red);
			Debug.DrawRay(Vector3.zero, up, Color.green);
			Debug.DrawRay(Vector3.zero, targetDir, Color.blue);
			
		}
		int Step(float a, float x)
		{
			return x >= a ? 0 : 1; 
		}

这里我是用Unity实现的,这个代码可以让你看到,你构建的直角坐标系,也许你会说这也没用,是因为这些东西过于基础,或者你在你过去的项目中没用用到,在这里写出只是为了在我后续更新的文章中方便读者的理解,而且这些知识在项目中也是有用的。
这里着重说一下“1”处代码,可能有读者会不理解,这里这么处理的原因主要是因为,我们计算出的 targetDir 的方向是任意的,所以我们要防止它与我们参与辅助计算的向量重合,具体读者可以自己试试。

  • 函数讲解
public static Vector3 Cross(Vector3 a, Vector3 b);

这个函数会返回同时垂直于a, b向量的一个向量,如果a 和 b 原本就是互相垂直的那么,返回的向量也就是垂直的,简单的来说也就是向量的叉乘,这是一个重要的方法所以放在最后说,同时这个函数并不会很消耗性能,所以读者可以放心使用,Dot()函数也是一样的,不会对性能造成太大影响,但是CPU计算Cos 与 Sin 时是很耗时的。这点读者需要注意。

结尾

这篇文章会在后期继续修正。由于是公司电脑,所以使用时间不是那么充裕。希望对大家有所帮助。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
本人资源全部免费,更多资源请查看我的上传资源 ====================================================== 书 名:3D数学基础:图形与游戏开发 作 者:[美] 邓恩(Dunn F.),[美] 帕贝利(Parberry I.) 著;史银雪,陈洪,王荣静 译 出 版 社: 清华大学出版社 出版时间:2005-07-01 ISBN:9787302109464 纸书页数:380页 定 价:¥ 42.00 内容简介:《3D数学基础:图形与游戏开发》专业培训机构指定教学参考书,多家游戏开发企业共同推荐,游戏业界,探索游戏开发背后的核心秘密。《3D数学基础:图形与游戏开发》主要介绍了基本的3D数学概念,这对电脑游戏开发人员和编程人员来说尤为重要。作者详尽地讨论了数学理论,并在必要时提供几何说明,帮助读者形成直观的3D感。书还提供了将理论应用于实践的C++类,并且在每章结尾处提供练习。《3D数学基础:图形与游戏开发》介绍了基础概念,如向量、坐标空间、矩阵、变换、欧拉角、齐次坐标空间、几何图元、相交性检测和三角网格。 作者简介:Fletcher Dunn,是著名游戏开发公司Terminal Reality的主要开发人员,所参与开发的游戏包括《4×4DVO 2)、《夜曲》(Noturne),并且是《吸血莱恩》(BloodRayne)的主要负责人。他所开发的游戏遍及家用PC机的Windows、Machintosh、Dreamcast、PSⅡ、Xbox和GameCube几种主流平台。   Ian Parberry,是北德克萨斯大学计算机科学系的教授,在国际上被公认为是教授DirectX游戏开发的专家之一。 编辑推荐:《3D数学基础:图形与游戏开发》主要研究隐藏在3D几何世界背后的数学问题。涵盖了理论知识和C++实现代码。理论部分解释3D数学和几何之间的关系,列出的技巧与公式可以当做参考手册以方便查找。实现部分演示了怎样用代码来实现这些理论概念。读者论论了3D的方位,包括四元数和对不同表示技术之间的优劣比较。   描述了数学和几何的实际应用示例,提供了一些C++类和不同的矩阵类,每个类都完成特定的几何任务。   所有基本变换矩阵的完整来历。      专门用Python讲解计算机视觉编程 目录 第1章 简介 1.1 什么是3D数学 1.2 为什么选择本书 1.3 阅读本书需要的基础知识 1.4 概览 第2章 笛卡尔坐标系统 2.1 1D数学 2.2 2D笛卡尔数学 2.3 从2D到3D 2.4 练习 第3章 多坐标系 3.1 为什么要使用多坐标系 3.2 一些有用的坐标系 3.3 嵌套式坐标系 3.4 描述坐标系 3.5 坐标系转换 3.6 练习 第4章 向量 4.1 向量——数学定义 4.2 向量——几何定义 4.3 向量与点 4.4 练习 第5章 向量运算 5.1 线性代数与几何 5.2 符号约定 5.3 零向量 5.4 负向量 5.5 向量大小(长度或模) 5.6 标量与向量的乘法 5.7 标准化向量 5.8 向量的加法和减法 5.9 距离公式 5.10 向量点乘 5.11 向量叉乘 5.12 线性代数公式 5.13 练习 第6章 3D向量类 …… 第7章 矩阵 第8章 矩阵和线性变换 第9章 矩阵的更多知识 第10章 3D的方位与角位移 第11章 C++实现 第12章 几何图元 第13章 几何检测 第14章 三角网络 第15章 图形数学 第16章 可见性检测 第17章 后记 附录A 简单的数学概念 附录B 参考文献
OPhone平台2D游戏引擎实现——物理引擎(一) OPhone平台开发, 2010-10-19 17:27:20 标签 : Ophone平台 2D 游戏 引擎   上一篇文章我们介绍了常见的各种游戏特效的实现,你现在可以很轻松的实现各种游戏所需要的特效,但是,你可能已经意识到了,我们的游戏一般都需要进行碰撞检测,比如前面的火柴棍小人,我们需要检测子弹和敌人之间的碰撞;碰撞检测通常是游戏开发的难点,作为引擎必然少不了碰撞检测部分,这我们还是按照cocos2d的构架,使用Box2d作为物理引擎,下面我们将通过在Ophone平台实现一个小游戏,来对Box2d物理引擎进行学习。   Box2d   Box2D是一个用于游戏的2D刚体仿真库,它可以使物体的运动更加真实,让游戏场景看起来更具交互性。2D物理引擎能增强游戏世界物体如多边形(砖块,三角形,多边形)的动作的真实感从而提高游戏质量。该引擎通过用户设定的参数如重力,密度,摩擦,弹性等参数计算碰撞,角度,力和动力等。这些计算需要大量的数学,物理等知识,如果有兴趣也可以下载其源码来研究。 Box2d同时也提供了各种语言环境的实现,由于Ophone平台使用java作为变成语言,所以我们将选择使用Box2d的java版JBox2d,这也将产生一个问题,JBox2D是用processing库来处理图像显示,所以Ophone平台上则不适用,在Ophone平台上的图像渲染主要包括两种:Canvas和Opengl ES,因此我们可以任选其一种,这为了配合我们的引擎实现,选择通过Opengl ES来作为渲染部分,这部分就需要我们自己来实现,其实我们也可以不使用其图像渲染部分,因为我们主要是使用Box2d来做物理检测,稍后我们会通过一个实例游戏来介绍。 另外,比较优秀的2D物理引擎还有Chipmunk,对于谁好谁坏,我们这不去评价,如果要使用Chipmunk作为物理引擎会比Box2d稍微苦难一些,因为Chipmunk目前没有Java版本,所以只能通过JNI方式来使用,这就需要使用NDK来开发原生的C程序,使用C语言来做,效率要高很多,但是开发,调试的难度也将增加,有机会我们将可以介绍如何使用NDK来编写C程序,并同时整合Chipmunk物理引擎。 这只是我们对Box2d的一个简单介绍,让大家明白其用处,关于更多详细信息,大家可以参考其官方网站http://www.box2d.org/,图12-1则是cocs2d演示的Box2d物理引擎效果,学完这部分内容,你也可以很轻松将其运行在Ophone平台上。   图12-1 cocos2d Iphone Box2d演示   图12-1这每个方块都具有重力,摩擦力,碰撞检测规则,他们都处于同一个世界场景,不必眼红Iphone开发者,下面就给大家看一下,我们在Ophone平台提供的示例物理小游戏。 在学习使用Box2D引擎之前,我们需要了解一下一些常用的概念: 刚体(rigid body) 一块十分坚硬的物质,它上面的任何两点之间的距离都是完全不变的。它们就像钻石那样坚硬。我们用物体(body)来代替刚体。 形状(shape) 一块严格依附于物体(body)的 2D 碰撞几何结构(collision geometry)。形状具有摩擦(friction)和恢复(restitution)的材料性质。 约束(constraint) 一个约束(constraint)就是消除物体自由度的物理连接。在 2D ,一个物体有 3 个自由度。如果我们把一个物体钉在墙上(像摆锤那样),那我们就把它约束到了墙上。这样,此物体就只能绕着这个钉子旋转,所以这个约束消除了它 2 个自由度。 接触约束(contact constraint) 一个防止刚体穿透,以及用于模拟摩擦(friction)和恢复(restitution)的特殊约束。你永远都不必创建一个接触约束,它们会自动被 Box2D 创建。 关节(joint) 它是一种用于把两个或多个物体固定到一起的约束。Box2D 支持的关节类型有:旋转,棱柱,距离等等。关节可以支持限制(limits)和马达(motors)。 关节限制(joint limit) 一个关节限制(joint limit)限定了一个关节的运动范围。例如人类的胳膊肘只能做某一范围角度的运动。 关节马达(joint motor) 一个关节马达能依照关节的自由度来驱动所连接的物体。例如,你可以使用一个马达来驱动一个肘的旋转。 世界(world) 一个物理世界就是物体,形状和约束相互作用的集合。Box2D 支持创建多个世界,但这通常是不必要的。 这先给大家介绍就是让大家明白Box2d包括哪些内容,稍后对框架的介绍时就能更加容易理解,当然对于这些具体的功能,我们会在后面跟着示例代码一起学习。   Ophone Box2d   首先分析一下我们在Ophone平台上的Box2dDemo需要实现什么功能,首先我们将整个屏幕构建成一个盒子,然后再盒子设置各种障碍,当我们触摸屏幕上任意位置时,就释放一个当前选择的物体,然后该物体将受到重力等因素的影响开始运动,直到最后静止下来。运行效果如图12-2所示。   图12-2 OphoneBox2d效果   屏幕间的长条则是我们设置的障碍,而圆形和矩形都是我们在点击屏幕时要释放的物体,前面我们说过,JBox2d的图形部分在Ophone不能用,所以我们会专门介绍如何通过Opengl ES来对图形图像进行渲染,另外,该示例的这些物体都是通过纹理映射来将图片映射到四边形上。为了大家能掌握图形系统相关内容,我们还实现了一个功能,玩家可以自己设置障碍,只需要点击Menu,选择"编辑模式"就可以进入障碍编辑状态,如图12-3所似。   图12-3 障碍编辑状态   当障碍编辑完成之后再次选择编辑模式,则恢复到游戏,此时我们所编辑的这些障碍都会正常的运行。当然该过程我们并没有使用引擎来完成,目的在于让大家更清楚渲染的原理,以及代码能够更多的重用,也就是说,大家可以直接拷贝代码到需要的游戏去即可。同时大家也能掌握很多Opengl ES的相关知识。   Ophone平台如何使用JBox2d   要使用JBox2d我们首先需要获得其源码或者jar包,这个就不用多说了,知道其官方网站下载即可,这我们下载了一个完整版本jbox2d-2.0.1-full.jar,让后将其放入我们所建立OphoneBox2d工程的lib文件夹下,JBox2d大致包含了如图12-4所示的一些包:   图12-4 JBox2d结构图   其org.jbox2d.collision比较重要,主要负责处理碰撞相关,包括对一些多边形的实现,这所说的多边形主要是一些数据,比如多边形的位置,大小,重力,形状,质量等属性;org.jbox2d.common包主要用来设置一些全局的属性(Setting.java),调试时所使用的颜色(Color3f.java),以及其他的一些数学相关的内容,因为我们说了Box2d他主要不是来做渲染的,但是有时候我们需要知道所设置的这些物体是否正确,进行调试,就需要绘制这些简单的图形,并显示出来,供我们调试;org.jbox2d.dynamics包主要负责动力学相关的内容,下面是常见的功能包描述。 org.jbox2d.collision包 AABB:AABB坐标 OBB:OBB坐标 ContactID:接触ID ContactPoint:接触点 ManifoldPoint:繁殖点 Segment:线段 Shape:外形基类 ShapeDef:外形定义基类 CircleDef:圆外形定义 CircleShape:圆外形 FilterData:碰撞过滤器 MassData:质量运算器 PolygonDef:多边开定义 PolygonShape:凸多边形 org.jbox2d.common包 Color3f:调试绘图颜色 Settings:全局设置 Mat22:2*2 矩阵 Sweep:碰撞描述 Vec2:向量(x ,y) XForm:坐标转换,平移或旋转 标准的版本还会存在Mat33表示3*3的矩阵和Vec3向量(x,y,z),该java版本没有出现这些。 org.jbox2d.dynamics包 Body:刚体或叫物体 BodyDef:刚体定义 BoundaryListener:世界边界侦听 ContactFilter:继承这个类用来获取过滤碰撞 ContactListener:继承这个类用来获取碰撞结果 DebugDraw:调试绘图,用于调试 DestructionListener:关节或外形销毁时处理方法 World:物理世界 org.jbox2d.dynamics.contacts Contact:管理两个外形接触 ContactEdge:接触边用来连接多个物体和接触到一个接触表 ContactResult:记录接触结果 org.jbox2d.dynamics.Joints DistanceJoint:距离校正器 DistanceJointDef:距离连接定义 GearJoint:齿轮 GearJointDef:齿轮连接定义 Joint:连接基类 JointDef:连接定义基类 JointEdge:用于组合刚体或连接到一起.刚体相当于节点,而连接相当于边 MouseJoint:鼠标连接 MouseJointDef:鼠标连接定义 PrismaticJoint:棱柱连接 PrismaticJointDef:棱柱连接定义 PulleyJoint:滑轮连接 PulleyJointDef:滑轮连接定义 RevoluteJoint:旋转连接 RevoluteJointDef:旋转连接定义 org.jbox2d.testbed:主要是一些用来测试的程序 添加JBox2d到Ophone项目   要在工程使用JBox2d库,需要将JBox2d添加到工程,添加方法如下: 右键单击工程,选择"Properties",进入项目Properties界面。 选择"Java Build Path",选择"Libraries"选项卡。 在点击"Add Jars..."按钮,添加Jar。 选择当前工程我们之前放入lib文件夹的jbox2d-2.0.1-full.jar文件,如图12-5所示,单击"确定"按钮即可。   图12-5 添加jbox2d-2.0.1-full.jar   OphoneBox2d框架   现在工程的结构展开应该如图12-6所示。   图12-6 OphoneBox2d项目结构   其实现该工程的文件如下: Box2dTest:工程Activity,入口 GameGLSurfaceView:游戏GLSurfaceView GLRenderer:Opengl es渲染器 DrawObject:使用Opengl ES来绘制常用图形(矩形,圆形) PhysicsWorld:物理世界场景   OphoneBox2d实现   开始分析代码之前,我们先确定一下需要准备的资源图片,从图12-2所示,我们可以看出,多少需要一个矩形和一个圆形的图片(当然也可直接指定颜色绘制矩形和圆形),这我们将使用图片来进行纹理映射,该工程所需要的纹理图片如图12-7所示。    图12-7 资源图片   Box2dTest实现   该类继承自Activity,将作为本程序的入口,授予我们是通过Opengl ES来渲染的,所以构建需要构建一个GLSurfaceView对象作为Opengl ES的窗口,然后通过setContentView函数来设置显示该窗口视图。然后分别在onPause和onResume函数调用GLSurfaceView类的GLSurfaceView。当然这也是所有Opengl ES程序的渲染基础框架,所有的Opengl ES程序窗口都由GLSurfaceView来实现。具体实现入代码清单12-1所示。
目录: 第Ⅰ部分 基础知识 必备的数学知识 3D空间向量 向量相等 计算向量的长度 向量的规范化 向量加法 向量减法 数乘 点积 叉积 矩阵 矩阵相等、矩阵数乘和矩阵加法 矩阵乘法 单位矩阵 逆矩阵 矩阵的转置 D3DX矩阵 基本变换 平移矩阵 旋转矩阵 比例变换矩阵 几何变换的组合 向量变换的一些函数 平面(选读) D3DXPLANE 点和平面的空间关系 平面的创建 平面的规范化 平面的变换 平面到某一点的最近点 射线(选读) 射线 射线与平面的相交 小结    第Ⅱ部分 Direct3D基础 第1章 初始化Direct3D 1.1 Direct3D概述 1.1.1 REF设备 1.1.2 D3DDEVTYPE 1.2 COM(组件对象模型) 1.3 预备知识 1.3.1 表面 1.3.2 多重采样 1.3.3 像素格式 1.3.4 内存池 1.3.5 交换链和页面置换 1.3.6 深度缓存 1.3.7 顶点运算 1.3.8 设备性能 1.4 Direct3D的初始化 1.4.1 获取接口IDirect3D9的指针 1.4.2 校验硬件顶点运算 1.4.3 填充D3DPRESENT_PARAMETER结构 1.4.4 创建IDirect3DDevice9 接口 1.5 例程:Direct3D的初始化 1.5.1 d3dUtility.h/cpp 1.5.2 例程框架 1.5.3 例程:D3D初始化 1.6 小结 第2章 绘制流水线 2.1 模型表示 2.1.1 顶点格式 2.1.2 三角形单元 2.1.3 索引 2.2 虚拟摄像机 2.3 绘制流水线 2.3.1 局部坐标系 2.3.2 世界坐标系 2.3.3 观察坐标系 2.3.4 背面消隐 2.3.5 光照 2.3.6 裁剪 2.3.7 投影 2.3.8 视口变换 2.3.9 光栅化 2.4 小结 第3章 Direct3D的绘制 3.1 顶点缓存与索引缓存 3.1.1 创建顶点缓存和索引缓存 3.1.2 访问缓存内容 3.1.3 获取顶点缓存和索引缓存的信息 3.2 绘制状态 3.3 绘制的准备工作 3.4 使用顶点缓存和索引缓存进行绘制 3.4.1 IDirect3DDevice9::DrawPrimitive 3.4.2 IDirect3DDevice9::DrawIndexedPrimitive 3.4.3 Begin/End Scene 3.5 D3DX几何体 3.6 例程:三角形、立方体、茶壶、D3DXCreate* 3.7 小结 第4章 颜色 4.1 颜色表示 4.2 顶点颜色 4.3 着色 4.4 例程:具有颜色的三角形 4.5 小结 第5章 光照 5.1 光照的组成 5.2 材质 5.3 顶点法线 5.4 光源 5.5 例程:光照 5.6 一些附加例程 5.7 小结 第6章 纹理映射 6.1 纹理坐标 6.2 创建并启用纹理 6.3 纹理过滤器 6.4 多级渐进纹理 6.4.1 多级渐进纹理过滤器 6.4.2 使用多级渐进纹理 6.5 寻址模式 6.6 例程:纹理四边形 6.7 小结 第7章 融合技术 7.1 融合方程 7.2 融合因子 7.3 透明度 7.3.1 Alpha通道 7.3.2 指定Alpha来源 7.4 用DirectX Texture Tool 创建Alpha通道 7.5 例程:透明效果 7.6 小结 第8章 模板 8.1 模板缓存的使用 8.1.1 模板缓存格式的查询 8.1.2 模板测试 8.1.3 模板测试的控制 8.1.4 模板缓存的更新 8.1.5 模板写掩码 8.2 例程:镜面效果 8.2.1 成像的数学问题 8.2.2 镜面效果实现概述 8.2.3 代码解析 8.3 例程:Planer Shadows 8.3.1 平行光阴影 8.3.2 点光源产生的阴影 8.3.3 阴影矩阵 8.3.4 使用模板缓存防止二次融合 8.3.5 代码解析 8.4 小结 第Ⅲ部分 Direct3D的应用 第9章 字体 9.1 ID3DXFont接口 9.1.1 创建一个ID3DXFont 接口对象 9.1.2 绘制文本 9.1.3 计算每秒绘制的帧数 9.2 CD3DFont 9.2.1 创建CD3DFont类的实例 9.2.2 绘制文本 9.2.3 清理 9.3 D3DXCreateText函数 9.4 小结 第10章 网格(一) 10.1 几何信息 10.2 子集和属性缓存 10.3 绘制 10.4 网格优化 10.5 属性表 10.6 邻接信息 10.7 克隆 10.8 创建网格(D3DXCreateMeshFVF) 10.9 例程:网格的创建与绘制 10.10 小结 第11章 网格(二) 11.1 ID3DXBuffer 11.2 XFile 11.2.1 加载XFile文件 11.2.2 XFile材质 11.2.3 例程:XFile 11.2.4 生成顶点法线 11.3 渐进网格 11.3.1 生成渐进网格 11.3.2 顶点属性权值 11.3.3 ID3DXPMesh接口方法 11.3.4 例程:Progressive Mesh 11.4 外接体 11.4.1 一些新的特殊常量 11.4.2 外接体的类型 11.4.3 例程:Bounding Volumes 11.5 小结 第12章 设计一个灵活的Camera类 12.1 Camera类的设计 12.2 实现细节 12.2.1 观察矩阵(取景变换矩阵, View Matrix)的计算 12.2.2 绕任意轴的旋转 12.2.3 俯仰、偏航和滚动 12.2.4 行走、扫视和升降 12.3 例程:Camera 12.4 小结 第13章 地形绘制基础 13.1 高度图 13.1.1 创建高度图 13.1.2 加载RAW文件 13.1.3 访问和修改高度图 13.2 创建地形几何信息 13.2.1 顶点的计算 13.2.2 索引的计算 13.3 纹理映射 13.4 光照 13.4.1 概述 13.4.2 坐标方格的明暗度计算 13.4.3 对地形进行着色 13.5 在地形“行走” 13.6 例程:Terrain 13.7 一些改进 13.8 小结 第14章 粒子系统 14.1 粒子和点精灵 14.1.1 结构格式 14.1.2 点精灵的绘制状态 14.1.3 粒子及其属性 14.2 粒子系统的组成 14.2.1 绘制一个粒子系统 14.2.2 随机性 14.3 具体的粒子系统 14.3.1 例程:Snow System 14.3.2 例程:Firework 14.3.3 例程:Particle Gun 14.4 小结 第15章 拾取 15.1 屏幕到投影窗口的变换 15.2 拾取射线的计算 15.3 对射线进行变换 15.4 射线/物体相交判定 15.5 例程:Picking 15.6 小结
Introduction to 3D Game Programming with DirectX 9.0,文书名为《DirectX 9.0 3D 游戏开发编程基础》,资源是这本书的英文原版,配有详细的书签目录 最后附上其文目录 目录 第Ⅰ部分 基础知识 必备的数学知识 3 3D空间向量 3 向量相等 7 计算向量的长度 7 向量的规范化 8 向量加法 9 向量减法 9 数乘 10 点积 11 叉积 11 矩阵 12 矩阵相等、矩阵数乘和矩阵加法 13 矩阵乘法 14 单位矩阵 15 逆矩阵 15 矩阵的转置 16 D3DX矩阵 16 基本变换 19 平移矩阵 20 旋转矩阵 21 比例变换矩阵 23 几何变换的组合 24 向量变换的一些函数 25 平面(选读) 26 D3DXPLANE 27 点和平面的空间关系 27 平面的创建 28 平面的规范化 29 平面的变换 29 平面到某一点的最近点 30 射线(选读) 31 射线 31 射线与平面的相交 32 小结 32 第Ⅱ部分 Direct3D基础 第1章 初始化Direct3D 37 1.1 Direct3D概述 37 1.1.1 REF设备 38 1.1.2 D3DDEVTYPE 38 1.2 COM(组件对象模型) 38 1.3 预备知识 39 1.3.1 表面 39 1.3.2 多重采样 41 1.3.3 像素格式 42 1.3.4 内存池 42 1.3.5 交换链和页面置换 43 1.3.6 深度缓存 44 1.3.7 顶点运算 45 1.3.8 设备性能 45 1.4 Direct3D的初始化 46 1.4.1 获取接口IDirect3D9的指针 47 1.4.2 校验硬件顶点运算 47 1.4.3 填充D3DPRESENT_PARAMETER结构 48 1.4.4 创建IDirect3DDevice9接口 50 1.5 例程:Direct3D的初始化 51 1.5.1 d3dUtility.h/cpp 52 1.5.2 例程框架 53 1.5.3 例程:D3D初始化 54 1.6 小结 56 第2章 绘制流水线 58 2.1 模型表示 59 2.1.1 顶点格式 60 2.1.2 三角形单元 60 2.1.3 索引 61 2.2 虚拟摄像机 62 2.3 绘制流水线 63 2.3.1 局部坐标系 64 2.3.2 世界坐标系 64 2.3.3 观察坐标系 65 2.3.4 背面消隐 67 2.3.5 光照 68 2.3.6 裁剪 68 2.3.7 投影 69 2.3.8 视口变换 70 2.3.9 光栅化 72 2.4 小结 72 第3章 Direct3D的绘制 73 3.1 顶点缓存与索引缓存 73 3.1.1 创建顶点缓存和索引缓存 73 3.1.2 访问缓存内容 76 3.1.3 获取顶点缓存和索引缓存的信息 77 3.2 绘制状态 78 3.3 绘制的准备工作 78 3.4 使用顶点缓存和索引缓存进行绘制 79 3.4.1 IDirect3DDevice9::DrawPrimitive 79 3.4.2 IDirect3DDevice9::DrawIndexedPrimitive 80 3.4.3 Begin/End Scene 81 3.5 D3DX几何体 81 3.6 例程:三角形、立方体、茶壶、D3DXCreate* 83 3.7 小结 87 第4章 颜色 89 4.1 颜色表示 89 4.2 顶点颜色 92 4.3 着色 92 4.4 例程:具有颜色的三角形 93 4.5 小结 95 第5章 光照 97 5.1 光照的组成 97 5.2 材质 98 5.3 顶点法线 100 5.4 光源 102 5.5 例程:光照 105 5.6 一些附加例程 108 5.7 小结 108 第6章 纹理映射 109 6.1 纹理坐标 110 6.2 创建并启用纹理 111 6.3 纹理过滤器 112 6.4 多级渐进纹理 113 6.4.1 多级渐进纹理过滤器 114 6.4.2 使用多级渐进纹理 114 6.5 寻址模式 114 6.6 例程:纹理四边形 116 6.7 小结 118 第7章 融合技术 119 7.1 融合方程 119 7.2 融合因子 121 7.3 透明度 122 7.3.1 Alpha通道 122 7.3.2 指定Alpha来源 123 7.4 用DirectX Texture Tool创建Alpha通道 123 7.5 例程:透明效果 125 7.6 小结 127 第8章 模板 128 8.1 模板缓存的使用 129 8.1.1 模板缓存格式的查询 129 8.1.2 模板测试 130 8.1.3 模板测试的控制 130 8.1.4 模板缓存的更新 132 8.1.5 模板写掩码 132 8.2 例程:镜面效果 133 8.2.1 成像的数学问题 133 8.2.2 镜面效果实现概述 134 8.2.3 代码解析 135 8.3 例程:Planer Shadows 139 8.3.1 平行光阴影 139 8.3.2 点光源产生的阴影 140 8.3.3 阴影矩阵 141 8.3.4 使用模板缓存防止二次融合 142 8.3.5 代码解析 143 8.4 小结 144 第Ⅲ部分 Direct3D的应用 第9章 字体 149 9.1 ID3DXFont接口 149 9.1.1 创建一个ID3DXFont接口对象 149 9.1.2 绘制文本 150 9.1.3 计算每秒绘制的帧数 151 9.2 CD3DFont 152 9.2.1 创建CD3DFont类的实例 152 9.2.2 绘制文本 152 9.2.3 清理 153 9.3 D3DXCreateText函数 153 9.4 小结 155 第10章 网格(一) 156 10.1 几何信息 156 10.2 子集和属性缓存 157 10.3 绘制 159 10.4 网格优化 159 10.5 属性表 161 10.6 邻接信息 163 10.7 克隆 164 10.8 创建网格(D3DXCreateMeshFVF) 165 10.9 例程:网格的创建与绘制 167 10.10 小结 172 第11章 网格(二) 174 11.1 ID3DXBuffer 174 11.2 XFile 175 11.2.1 加载XFile文件 175 11.2.2 XFile材质 176 11.2.3 例程:XFile 177 11.2.4 生成顶点法线 180 11.3 渐进网格 181 11.3.1 生成渐进网格 182 11.3.2 顶点属性权值 183 11.3.3 ID3DXPMesh接口方法 183 11.3.4 例程:Progressive Mesh 184 11.4 外接体 187 11.4.1 一些新的特殊常量 189 11.4.2 外接体的类型 189 11.4.3 例程:Bounding Volumes 190 11.5 小结 192 第12章 设计一个灵活的Camera类 193 12.1 Camera类的设计 193 12.2 实现细节 195 12.2.1 观察矩阵(取景变换矩阵,View Matrix)的计算 195 12.2.2 绕任意轴的旋转 198 12.2.3 俯仰、偏航和滚动 199 12.2.4 行走、扫视和升降 201 12.3 例程:Camera 202 12.4 小结 205 第13章 地形绘制基础 206 13.1 高度图 207 13.1.1 创建高度图 207 13.1.2 加载RAW文件 208 13.1.3 访问和修改高度图 209 13.2 创建地形几何信息 210 13.2.1 顶点的计算 212 13.2.2 索引的计算 214 13.3 纹理映射 216 13.4 光照 219 13.4.1 概述 219 13.4.2 坐标方格的明暗度计算 220 13.4.3 对地形进行着色 222 13.5 在地形“行走” 222 13.6 例程:Terrain 226 13.7 一些改进 228 13.8 小结 229 第14章 粒子系统 230 14.1 粒子和点精灵 230 14.1.1 结构格式 230 14.1.2 点精灵的绘制状态 231 14.1.3 粒子及其属性 233 14.2 粒子系统的组成 234 14.2.1 绘制一个粒子系统 238 14.2.2 随机性 243 14.3 具体的粒子系统 243 14.3.1 例程:Snow System 244 14.3.2 例程:Firework 246 14.3.3 例程:Particle Gun 248 14.4 小结 250 第15章 拾取 251 15.1 屏幕到投影窗口的变换 253 15.2 拾取射线的计算 254 15.3 对射线进行变换 255 15.4 射线/物体相交判定 256 15.5 例程:Picking 258 15.6 小结 259 第Ⅳ部分 着色器和效果 第16章 高级着色语言(HLSL)入门 263 16.1 HLSL着色器程序的编制 264 16.1.1 全局变量 266 16.1.2 输入和输出结构 266 16.1.3 入口函数 267 16.2 HLSL着色器程序的编译 268 16.2.1 常量表 268 16.2.2 HLSL着色器程序的编译 272 16.3 变量类型 274 16.3.1 标量类型 274 16.3.2 向量类型 274 16.3.3 矩阵类型 275 16.3.4 数组 277 16.3.5 结构体 277 16.3.6 关键字typedef 277 16.3.7 变量的前缀 278 16.4 关键字、语句及类型转换 279 16.4.1 关键字 279 16.4.2 基本程序流程 279 16.4.3 类型转换 280 16.5 运算符 281 16.6 用户自定义函数 282 16.7 内置函数 284 16.8 小结 286 第17章 顶点着色器入门 287 17.1 顶点声明 288 17.1.1 顶点声明的描述 288 17.1.2 顶点声明的创建 291 17.1.3 顶点声明的启用 291 17.2 顶点数据的使用 291 17.3 使用顶点着色器的步骤 293 17.3.1 顶点着色器的编写与编译 294 17.3.2 顶点着色器的创建 294 17.3.3 顶点着色器的设置 294 17.3.4 顶点着色器的销毁 295 17.4 例程:Diffuse Lighting 295 17.5 例程:Cartoon Rendering 302 17.5.1 卡通着色 303 17.5.2 卡通着色的顶点着色器代码 304 17.5.3 轮廓的勾勒 307 17.5.4 实现轮廓勾勒的顶点着色器代码 310 17.6 小结 312 第18章 像素着色器入门 313 18.1 多重纹理概述 313 18.1.1 启用多重纹理 315 18.1.2 多重纹理坐标 316 18.2 像素着色器的输入和输出 317 18.3 使用像素着色器的步骤 318 18.3.1 像素着色器的编写和编译 318 18.3.2 像素着色器的创建 318 18.3.3 像素着色器的设置 319 18.3.4 像素着色器的销毁 319 18.4 HLSL采样器对象 319 18.5 例程:像素着色器的多重纹理 321 18.6 小结 329 第19章 效果框架 331 19.1 手法与路径 331 19.2 更多HLSL的内置对象 333 19.2.1 纹理对象 333 19.2.2 采样器对象与采样器状态 333 19.2.3 顶点着色器对象和像素着色器对象 334 19.2.4 字符串 335 19.2.5 注释 335 19.3 效果文件的设备状态 336 19.4 创建一种效果 337 19.5 常量的设置 338 19.6 使用一种效果 340 19.6.1 效果句柄的获取 341 19.6.2 效果的激活 341 19.6.3 效果的启用 341 19.6.4 当前绘制路径的设置 342 19.6.5 效果的终止 342 19.6.6 一个例子 342 19.7 例程:效果文件的光照和纹理 343 19.8 例程:雾效 349 19.9 例程:卡通效果 352 19.10 EffectEdit 353 19.11 小结 354 附录 Windows编程入门 355 参考文献 372

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值