3D GAME PROGRAMMING WITH DIRECTX11 (2)

来源:互联网 发布:七日杀mac存档在哪里 编辑:程序博客网 时间:2024/05/18 03:36

我们先学第一章vector algebra  向量代数

 

这一章主要是描述了向量这个东东,主要跟STLvector是不一样的,这里是数学概念,而不是数据结构概念。这一章的目标有,学习向量究竟在数值上和几何学上代表的是什么?了解向量之间的操作,还有运行这些操作的接口方法。熟悉XNA数学库的函数和类。

1.1这节介绍了向量的定义,一般来说高中就学过的,只是会在几何上表示的意义的话可以去翻书看看,我们一般用到的都是2D3D的。还得注意长度和方向是向量的两个因素,基本我们都是围绕这两个因素来思考的。这节还介绍了,在坐标系中的表示和转换,左手定则和右手定则,D3D是采用了左手的。一些向量的基本运算,加减乘除什么的,这都是很基础的,实在不行就看看高等数学吧。

1.2这节主要是求向量的数值,简称为值,还有介绍了单位向量,其实求值就是类似勾股定理那样求,然后开方而已。然后把原先的向量去除以向量的值,这个就叫做向量的规格化。

1.3点积。主要的是点积得到是标量了,就只是一个值。然后可以靠这个值去判断两个向量之间的角是锐角还是钝角还是正交了。后面的例子中讲到了投影公式和正交化公式。这些知识可以去线性代数中找到,不懂正交化的可以参照这个https://en.wikipedia.org/wiki/Gram%E2%80%93Schmidt_process还有这个http://v.163.com/movie/2011/6/G/G/M82ICR1D9_M83J8JGGG.html

1.4交叉乘积。注意结果得到的还是一个向量,方向可以又左手定则得到,具体看书吧,很容易理解的。后面补充了一个伪2D叉积,感觉并没什么卵用。第二小节讲用叉积来正交化三个线性无关的向量,关键点是取哪个向量为不变的向量,会得到不同的正交化向量。

1.5点。首先区分了点和向量的概念,其实只要定了原电,两者是可以转换的。

1.6最重要的一节,XNA数学库。新的d3d不再使用老的D3DX数学库了,而是提供了一个XNA数学库,在windows平台上,这个数学库能使用SSW2指令集,SIMD 可以用一个指令来完成对432位的浮点数或整数的操作,所以运行速度很快,但2D,3D的运算需要先填充成4D的向量再进行操作。

1.6.1XNA数学库中局部变量和全局变量向量的类型是XMVECTOR

对于类的数据成员,2,3,4D分别采用XMFLOAT2XMFLOAT3XMFLOAT4的类型。

在进行计算之前,使用载入函数( loading functions )来将 XMFLOAT* 类型转换成 XMVECTOR 类型。

 

运算时要用 XMVECTOR 的实例。

使用存储函数( storage functions )来将 XMVECTOR 转换成 XMFLOAT* 类型。

1.6.2介绍了载入函数( loading functions )和存储函数( storage functions )。

1.6.3参数的传递。介绍了CXMVECTOR FXMVECTOR 这两种参数类型,定义函数时,参数类型的注意事项:

 

函数的前三个 XMVECTOR 类型必须是 FXMVECTOR ,而后面的都是 CXMVECTOR 

1.6.4常量向量,需要应该定义为XMVECTORF32类型(用于存储浮点向量)或XMVECTORU32类型(用于存储整数向量),切记得初始化。

1.6.5重载运算符,介绍了很多的重载运算符,可以通过定义XM_NO_OPERATOR_OVERLOADS来取消这些重载,取消的话会提高一些运行速度吧,但这本书不会取消。

1.6.6miscellaneous,翻译是混杂的,我把它翻译成其他的参数吧,这一节主要是讲圆周率的知识的,圆周率的定义,变换弧度,角度什么的。还有最大值最小值宏。

1.6.7设置函数,如何设置一个XMVECTOR变量的值的,还展示了一个控制台程序。

1.6.8向量方法,展示了实现我们前面那几节所说的数学知识的函数,所有的这些函数,如果返回值不是 BOOL 或者 VOID 的话,那么必然是 XMVECTOR ,包括返回一个浮点值的点乘函数。也用了一个控制台程序展示了。

1.6.9浮点数错误。用浮点数进行计算(甚至单纯地表示)时,会出现误差,所以等判断相等时,需要定义一个容许误差。然后作者写了一个使用了XMVECTOR 的控制台程序来验证自己所说的。

 

最后的练习并不难,大多也是证明题,主要是18题,其实参考我上面那两个链接的内容,都是可以做出来的。   还有就是19题,要查下文档,或者百度吧。下面我列几个咯。

XMVectorAbs(v)  ——返回一个向量,该向量的每个分量是v的对应分量的绝对值;

 

XMVectorCos(v)   ——返回一个向量,该向量的每个分量是v的对应分量的余弦值;

 

XMVectorLog(v)   ——返回一个向量,该向量的每个分量是v的对应分量的以2为底的对数值,log2X

 

XMVectorExp(v)   ——返回一个向量(e^v[0],e^v[1], e^v[2], e^v[3]),其中e^x表示ex次幂;

 

XMVectorPow(u, v)   ——返回一个向量(u[0]^v[0], u[1]^v[1],u[2]^v[2], u[3]^v[3]),其中x^y表示xy次幂;

 

XMVectorSqrt(v)   ——返回一个向量,该向量的每个分量是v的对应分量的算术平方根;

 

XMVectorSwizzle(v,a, b, c, d)   ——返回一个向量(v[a],v[b], v[c], v[d]),至于a,b,c,d越出0,1,2,3这个范围的话会发生什么事情,请读者自行研究;

 

XMVectorMultiply(u,v)   ——返回一个向量,该向量的每个分量是u的对应分量与v的对应分量的乘积;

 

XMVectorSaturate(v)     ——返回由v的各个分量进行saturate操作后得到的值组成的向量;saturate(x)返回0(若x<0),x(若0<=x<=1)或者1x>1)。

0 0