《DirectX 9.0 3D游戏开发编程基础》必备的数学知识 读书笔记

最近在看游戏导航源码,但是看了几天感觉看不懂。里面全是一些几何运算,以及一些关于3d方面的知识。发现自己缺少3d这方面的知识,正好也想研究一下3d游戏开发的基本原理,于是决定买本书看看了,后来在opengl和directx要选择一个,感觉directX是微软的,就选了directx。

必备的数学知识

3D空间中的向量

几何学中一个有向线段表示,向量两个重要属性:长度、方向

向量不含有位置信息,如果向量的长度和方向相等即相等  。

左手直角坐标系和右手直角坐标系:左手直角坐标系z轴正方向穿进纸面,右手直角坐标系中z轴正方向穿出纸面。

向量处于标准位置:当某一向量起始端与坐标原点重合时。这样我们可以用向量的终点坐标来描述一个处于标准位置的向量。用于描述向量的坐标称为分量(component)

注意:由于标准位置中的向量都是用终点来表示的,因此点和向量很容易混淆。所以再次重申:点只是描述位置而向量描述了长度和方向

向量的表示:u=(ux,uy),N=(Nx,Ny,Nz) 通常用小写(有时也用大写)粗体字母来表示

四个特殊的3d向量:

  1. 零向量:其所有分量都为0用粗体0来表示 0 = (0,0,0)
  2. 其余三个向量称为R3的标准向量。这些向量分别为i,j,k方向,方向分别与x,y,z轴一致,且长度均为1:i=(1,0,0),j=(0,1,0),k=(0,0,1)

在D3DX库中,我们用类D3DXVECTOR3表示3d空间的向量。

向量相等

如果向量和长度方面相等,那么相等。

D3DXVECTOR u(1.0f,0.0f,1.0f);

D3DXVECTOR v(0.0f,1.0f,1.0f);

if(u == v) return true

向量计算长度

FLOATD3DXVec3Length(CONST D3DXVECTOR3 * pV);

向量的规范化

向量的规范化就是使向量的模变为1.即变为单位向量。可以通过将向量的每个分量都除向量的模来实现 。

D3DXVECTOR3 * D3DXVec3Normalize(D3DXVECTOR3 * pOut)

向量的相加

几何学上的向量相加


D3DXVECTOR3 u(2.0f, 0.0f, 1.0f);
D3DXVECTOR3 v(0.0f, -1.0f, 5.0f); // (2.0 + 0.0, 0.0 + (-1.0), 1.0 + 5.0)
D3DXVECTOR3 sum = u + v; // = (2.0f, -1.0f, 6.0f)

向量减法:

D3DXVECTOR3 u(2.0f, 0.0f, 1.0f);
D3DXVECTOR3 v(0.0f, -1.0f, 5.0f);
D3DXVECTOR3 difference = u - v; // = (2.0f, 1.0f, -4.0f)

数乘(标量与向量的乘积)

标量可以与向量相乘,顾名思义,该运算可对向量进行缩放。该运算不改变向量的方向,除非该向量与负数相乘,这是向量的方向与原来的方面相反 。

D3DXVECTOR3 u(1.0f, 1.0f, -1.0f);

D3DXVECTOR3 scaledVec = u * 10.0f; // = (10.0f, 10.0f, -10.0f)

点积(两个向量的乘积)

如果u和v都是单位向量则v*u就等于u,v夹角的余弦。

下面是点积的一些有用的性质:

  1. 若u*v=0 则u⊥v
  2. 若u*v>0 则两向量之间的夹角小于90度
  3. 若u*v<0 则两向量之间的夹角大于90度

FLOAT D3DXVec3Dot( // Returns the result.
CONST D3DXVECTOR3* pV1, // Left sided operand.
CONST D3DXVECTOR3* pV2 // Right sided operand.
);

叉积

与点积不同的是,叉积的结果是另一个向量。如果取向量 u和v的差积,运算所得的向量p与v、u彼此正交,也就是p与u正交,也行v正交。

矩阵

一个m*n的矩阵是一个m行,n列的矩形数组。行数和列数指定了矩阵的维数。我们用双下标来标识矩阵元素,其中第一个下标为元素所在行的索引,第二个下标不元素成在列的索引。

有时一个矩阵仅包含单行或单列。这样的矩阵称为行向量或列向量,下面是一人行向量和列向量的例子。

矩阵相等、数乘、加法

  • 相等:维数相同、对应元素相同。
  • 数乘:一个标量与矩阵每一个元素相乘
  • 相加:只有两个矩阵维数相同时,方可进行。加法就是对应元素相加所得的矩阵。
  • 减法:与加法相似

矩阵乘法

前提条件:A的列数等于B的行数,故乘积AB是有意义的。请注意,如果交换相乘的次序为BA 便无意义,因为B的列数和 A的行数不相等

由此说明:一般情况下矩阵乘法不满足乘法交换律(也就是, AB≠BA)

定义:若A为m*n的矩阵,B为n*p的矩阵,则乘积AB有意义,且等于一个m*p矩阵C,其中乘积C的第ij个元素的值等于A的第i个行向量与B的第j个列向量的点积。

单位矩阵:

有一种特殊的矩阵为单位矩阵,单位矩阵的特点是除主对角线上的元素为1外,其余元素均为0,而且是方阵。

单位矩阵可以作为一个乘法单位:MI=IM=M

即:用一个单位矩阵与某个矩阵相乘,不改变该矩阵。而且,某一矩阵与单位矩阵相乘,

逆矩阵:

逆矩阵的重要信息

  1. 只有方阵才能有逆矩阵,所以,当我们提到逆矩阵时,我们假定所关心的对象为方阵
  2. 一个m*n矩阵M的逆矩阵也是一个n*m矩阵,用符号M^-1表示。
  3. 并非所有方阵都有逆矩阵
  4. 一个矩阵与其逆矩阵的乘积为单位阵。

一个性质:(AB)^-1 = B^-1 A^-1

矩阵的转置

通过交换矩阵行和列来实现M的矩阵用M^T表示

D3DX矩阵 

编写D3Dx应用程序时,我们通常只使用4*4的矩阵和1*4的行向量。注意这两种维数的矩阵,意味着如下矩阵乘法是有意义的。

  1. 向量矩阵乘法
  2. 矩阵矩阵乘法

基本变换

在Direct3D编程时,我们使用4*4的矩阵表示一个变换。其思路如下:

  1. 设置一个4*4矩阵中元素的值
  2. 然后我们将某一点的坐标或某一向量的分量放入一个1*4的行向量v中
  3. 乘积vX就生成了一个新的经过变化的向量v’

平移矩阵

旋转矩阵

比例变换矩阵

几何变换的组合

时间: 2024-09-25 16:31:41

《DirectX 9.0 3D游戏开发编程基础》必备的数学知识 读书笔记的相关文章

《DirectX 9.0 3D游戏开发编程基础》 第二章 绘制流水线 读书笔记

模型的表示 场景:物品或模型的集合 任何物品都可以用三角形网络逼近表示.我们经常用以下术语描述三角形网络:多边形(polygons).图元(primitives).网络几何单元(mesh geometry). 描述三角形:指定三个顶点 描述物品:三角形单元列表 顶点格式 可以创建我们所希望包含的顶点信息,如位置,颜色等,如下所示 Code Snippet struct ColorVertex{     float _x,_y,_z;     DWORD color; }; struct Norm

《DirectX 9.0 3D游戏开发编程基础》 第一章 初始化Direct3D 读书笔记

  REF设备 参考光栅设备,他能以软件计算方式完全支持Direct3D Api.借助Ref设备,可以在代码中使用那些不为当前硬件所支持的特性,并对这此特性进行测试. D3DDEVTYPE 在程序代码中,HAL设备用值D3DDEVTYPE_HAL来表示.该值是一个枚举变量.REF设备用D3DDEVTYPE_REF来表示.这种类型非常重要,你需要铭记,因为在创建设备的时候,我们必须指定使用哪种设备类型. COM(组件对象模型) 创建COM接口时不可以使用c++关键字new.此外使用完接口,应调用R

Windows Phone 7开发教程(2)——Windows Phone XNA 4.0 3D游戏开发

程序代码编译环境Visual Stuido 2010, Windows Phone 7 SDK, XNA 4.0 Game Studio, 下载链接: http://files.cnblogs.com/aawolf/XNA_aawolf_3D.rar 今天有点空余时间,在看Windows Phone 7的开发.看到Silverlight for phone和XNA 4.0的开发文章已经有了不少,而且质量很高.我就来说说XNA 4.0 的3D开发这个领域吧,正好跟目前的工作有些关系,而且XNA 4

《Unity 3D 游戏开发技术详解与典型案例》——1.1节Unity 3D基础知识概览

1.1 Unity 3D基础知识概览 Unity 3D 游戏开发技术详解与典型案例 本节主要向读者介绍Unity 3D的相关知识,主要内容包括Unity 3D的简介.Unity 3D的发展和Unity 3D的特点等.通过本节的学习,读者将对Unity 3D有一个基本的认识. 1.1.1 初识Unity 3D Unity 3D是由Unity Technologies开发的一个轻松创建三维视频游戏.建筑可视化.实时三维动画等互动内容的.多平台的综合型游戏开发工具,是一个全面整合的专业游戏引擎. Un

《Android 3D游戏开发技术宝典——OpenGL ES 2.0》——1.5节Android应用程序运行的机制

1.5 Android应用程序运行的机制 Android 3D游戏开发技术宝典--OpenGL ES 2.0 上一节介绍了如何搭建Android开发环境.如何开发Hello Android应用程序以及Android应用程序的调试,接下来在本节中将简要地介绍Android应用程序的运行机制. 1.5.1 应用程序的系统架构 Android平台由应用程序.应用程序框架.Android运行时.系统库以及底层Linux内核构成,详细结构如图1-54所示. 说明 应用程序层里面包含的就是需要读者去发挥创意

《Android 3D游戏开发技术宝典——OpenGL ES 2.0》——2.8节本章小结

2.8 本章小结Android 3D游戏开发技术宝典--OpenGL ES 2.0本章主要对Android平台下游戏开发中可能会用到的Android平台的相关基础知识进行了详细介绍,如文件的I/O操作.SQLite数据库的增.删.改.查,游戏中声音特效.蓝牙互联等.只有学好这些基础知识,开发人员才能开发出更好的Android手机游戏.读者一定要在这些基础上面下足了工夫,今后的开发道路才会一帆风顺. 提示 Android平台的其他相关知识还有很多,由于本书侧重于介绍OpenGL ES 2.0 3D

《Android 3D游戏开发技术宝典——OpenGL ES 2.0》——2.3节手机自带数据库——SQLite

2.3 手机自带数据库--SQLiteAndroid 3D游戏开发技术宝典--OpenGL ES 2.0上一节介绍了如何使用Preferences存储简单数据,而复杂的数据就需要存储到文件或数据库中了. Android自带了一款轻量级的关系数据库--SQLite,其具有体积小,功能强大等诸多特点,成为嵌入式设备首选的数据库系统.本节将带领读者走进SQLite的世界,去学习如何应用SQLite数据库进行数据的增.删.改.查等基本操作. 2.3.1 初识SQLiteSQLite是一款满足ACID特性

《Android 3D游戏开发技术宝典——OpenGL ES 2.0》——2.4节文件I/O

2.4 文件I/OAndroid 3D游戏开发技术宝典--OpenGL ES 2.0I/O即输入与输出,几乎所有文件操作的工作都离不开I/O.对于Android游戏开发来说,I/O操作尤为重要,游戏中的地图数据.人物图片资源等的流畅读取是保证游戏可玩性的重要方面.因此在开发时,不同的场合必须选用合适的I/O操作方式,才能保证满足用户的需求. Android中文件I/O分为3种方式:SD卡文件读取.手机中文件夹的访问和应用程序中Assets文件的读取,本节将结合简单的小案例对这几种文件I/O操作进

《Android 3D游戏开发技术宝典——OpenGL ES 2.0》——1.4节Hello Android应用程序的开发

1.4 Hello Android应用程序的开发 Android 3D游戏开发技术宝典--OpenGL ES 2.0 本节首先将介绍如何在Eclipse中创建一个基于Android的Hello World应用程序,之后将简单介绍Android应用程序的调试,为读者以后学习高级开发铺平道路. 1.4.1 第一个Android应用程序 本小节将向读者介绍如何在Eclipse中创建一个基于Android的Hello World应用程序,基本步骤如下所列. (1)首先打开Eclipse,然后依次选择Fi