《DirectX 9.0 3D游戏开发编程基础》必备的数学知识 读书笔记
最近在看游戏导航源码,但是看了几天感觉看不懂。里面全是一些几何运算,以及一些关于3d方面的知识。发现自己缺少3d这方面的知识,正好也想研究一下3d游戏开发的基本原理,于是决定买本书看看了,后来在opengl和directx要选择一个,感觉directX是微软的,就选了directx。
必备的数学知识
3D空间中的向量
几何学中一个有向线段表示,向量两个重要属性:长度、方向
向量不含有位置信息,如果向量的长度和方向相等即相等 。
左手直角坐标系和右手直角坐标系:左手直角坐标系z轴正方向穿进纸面,右手直角坐标系中z轴正方向穿出纸面。
向量处于标准位置:当某一向量起始端与坐标原点重合时。这样我们可以用向量的终点坐标来描述一个处于标准位置的向量。用于描述向量的坐标称为分量(component)

注意:由于标准位置中的向量都是用终点来表示的,因此点和向量很容易混淆。所以再次重申:点只是描述位置而向量描述了长度和方向
向量的表示:u=(ux,uy),N=(Nx,Ny,Nz) 通常用小写(有时也用大写)粗体字母来表示
四个特殊的3d向量:
- 零向量:其所有分量都为0用粗体0来表示 0 = (0,0,0)
- 其余三个向量称为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夹角的余弦。
下面是点积的一些有用的性质:
- 若u*v=0 则u⊥v
- 若u*v>0 则两向量之间的夹角小于90度
- 若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
即:用一个单位矩阵与某个矩阵相乘,不改变该矩阵。而且,某一矩阵与单位矩阵相乘,
逆矩阵:
逆矩阵的重要信息
- 只有方阵才能有逆矩阵,所以,当我们提到逆矩阵时,我们假定所关心的对象为方阵
- 一个m*n矩阵M的逆矩阵也是一个n*m矩阵,用符号M^-1表示。
- 并非所有方阵都有逆矩阵
- 一个矩阵与其逆矩阵的乘积为单位阵。
一个性质:(AB)^-1 = B^-1 A^-1
矩阵的转置
通过交换矩阵行和列来实现M的矩阵用M^T表示
D3DX矩阵
编写D3Dx应用程序时,我们通常只使用4*4的矩阵和1*4的行向量。注意这两种维数的矩阵,意味着如下矩阵乘法是有意义的。
- 向量矩阵乘法
- 矩阵矩阵乘法
基本变换
在Direct3D编程时,我们使用4*4的矩阵表示一个变换。其思路如下:
- 设置一个4*4矩阵中元素的值
- 然后我们将某一点的坐标或某一向量的分量放入一个1*4的行向量v中
- 乘积vX就生成了一个新的经过变化的向量v’
平移矩阵
旋转矩阵
比例变换矩阵
几何变换的组合
《DirectX 9.0 3D游戏开发编程基础》必备的数学知识 读书笔记的更多相关文章
- 【笔记】《DirectX 9.0 3D游戏开发编程基础》:Direct3D初始化
Direct3D初始化大概分为4个步骤: 1.获取接口IDirect3D9的指针.(Direct3DCreate9函数调用). 该接口用户获取系统中物理硬件设备的信息并创建接口IDirect3DDev ...
- 《DirectX 9.0 3D游戏开发编程基础》 第二章 绘制流水线 读书笔记
模型的表示 场景:物品或模型的集合 任何物品都可以用三角形网络逼近表示.我们经常用以下术语描述三角形网络:多边形(polygons).图元(primitives).网络几何单元(mesh geomet ...
- 《DirectX 9.0 3D游戏开发编程基础》 第一章 初始化Direct3D 读书笔记
REF设备 参考光栅设备,他能以软件计算方式完全支持Direct3D Api.借助Ref设备,可以在代码中使用那些不为当前硬件所支持的特性,并对这此特性进行测试. D3DDEVTYPE 在程序代码中, ...
- 自己在完第一遍STL和Directx 9.0 游戏开发编程基础书后的体会
如果一本书看一遍就能看懂,说明书对自己相对容易,没有必要在去看第二遍,但是对于大多数书籍,都有自己陌生的知识,看完一遍无法理解的地方,说明就是自己知识点最薄弱的,最需要去理解的地方,一旦自己理解了这些 ...
- Unity 4.2.0 官方最新破解版(Unity3D 最新破解版,3D游戏开发工具和游戏引擎套件)
Unity是一款跨平台的游戏开发工具,从一开始就被设计成易于使用的产品.作为一个完全集成的专业级应用,Unity还包含了价值数百万美元的功能强大的游戏引擎.Unity作为一个游戏开发工具,它的设计主旨 ...
- 转载:[转]如何学好3D游戏引擎编程
[转]如何学好3D游戏引擎编程 Albert 本帖被 gamengines 从 游戏引擎(Game Engine) 此文为转载,但是值得一看. 此篇文章献给那些为了游戏编程不怕困难的热血青年,它的 ...
- DirectX12 3D 游戏开发与实战第五章内容
渲染流水线 学习目标: 了解用于在2D图像中表现出场景立体感和空间深度感等真实效果的关键因素 探索如何用Direct3D表示3D对象 学习如何建立虚拟摄像机 理解渲染流水线,根据给定的3D场景的几何描 ...
- HTML5游戏开发技术基础整理
随着HTML5标准终于敲定.HTML5将有望成为游戏开发领域的的热门平台. HTML5游戏能够执行于包含iPhone系列和iPad系列在内的计算机.智能手机以及平板电脑上,是眼下跨平台应用开发的最佳实 ...
- Android 3D游戏开发
OpenGL ES(OpenGL Embedded System) Android 3D游戏开发技术宝典:OpenGL ES 2.0(android 3d游戏开发技术宝典 -opengl es 2.0 ...
随机推荐
- 《javascript高级程序设计》读书小延伸
这本书已经读了几章了,想着试试能不能做出点东西,就简单的练了把手.觉得对于初学者,自己试着练练,效果还不错的. 挥刀要从轻的开始,起初的原因是和同事谈起曾经的逝水年华(小时候干的坏事)时说起了曾经的一 ...
- uestc1633
uestc1633 题意 给你一个大小为 \(n\) 的集合 \(S\) ,集合里有 \(n\) 个互不相同正整数,有 \(q\) 个询问,每次询问是否能选择 \(S\) 中的一些数字 ( 同一个数字 ...
- luogu P1194 买礼物
题目描述 又到了一年一度的明明生日了,明明想要买B样东西,巧的是,这B样东西价格都是A元. 但是,商店老板说最近有促销活动,也就是: 如果你买了第I样东西,再买第J样,那么就可以只花K[I,J]元,更 ...
- CodeForces - 981G Magic multisets
假设我们可以对每个位置快速维护一个数组,记录每个位置有哪些值是已经出现了的,哪些值是没有出现的,这样就可以决定修改的时候到底是 *2 还是 +1了. 但是很可惜,并不存在功能这么强大的数组,所以只能另 ...
- python基础-匿名函数、内置函数、正则表达式、模块
1. 匿名函数 1.1 有名函数 有名函数:定义了一个函数名,函数名指向内存地址:通过函数名进行访问.函数名加括号就可以运行有名函数,例如:func() def func(x, y, z = 1): ...
- Problem R: 求斐波那契数列的前n项值
#include<stdio.h> int main() { int n; while(scanf("%d",&n)!=EOF){ int x1,x2,i,x; ...
- Java高级架构师(一)第12节:Service的实现以及模块化
BaseService.java package com.sishuok.architecture1.common.service; import java.util.List; import com ...
- RxJava 1.x 理解-3
在 RxJava 1.x 理解-1 中,我们说到了RxJava的简单用法,但是这还远远不够,因为 输入的数据 ---> 被监听者(订阅源)对这些数据进行操作,或者执行响应的处理 --> 产 ...
- IntelliJ IDEA字符串常量长度太长的问题解决:constant string too long
Java compiler下的Use compiler为Eclipse:
- HDU 3032 Nim or not Nim?(博弈,SG打表找规律)
Nim or not Nim? Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)T ...