DirectX 11游戏编程学习笔记2: 文章1章Vector Algebra(向量代数)

时间:2023-12-25 19:35:56

本文由哈里_蜘蛛侠原创,转载请注明出处。有问题欢迎联系2024958085@qq.com

        注:我给的电子版是700多页。而实体书是800多页,所以我在提到相关概念的时候。会使用章节号而非页码。

相同的情况适合于“龙书”第二版。

我们这一期正式開始学习DX 11编程了!

前三章组成了本书的第一部分。叫做“Mathematical Prerequisites”。学好这一部分是继续前进的前提条件。这一部分的导言前面引用了一句名言,这让我颇为意外。这让我想起了另外一本书,叫做《Problem Solving with C++》第7版;这本关于C++编程入门的书差点儿每一节前面都有(非常多时候还特别长)一段引用语,非常多都是来自文学作品的,让人认为非常有趣。

只是可惜的是。这样的引用语此书好像就仅仅出现了这一次……

这一次将讲述第1章:VectorAlgebra(向量代数)。

这一章(以及后面的两章)的内容非常easy,尤其是当你看过“龙书”第二版的时候;然而,还是有不少值得注意的地方的。

因为作者本人可能比較懒。再加上非常多内容并没有发生实质性的改变(比方说这几期要讲的数学部分),所以读过“龙书”第二版的人会认为非常多语句似曾相识。实际上并非似曾相识,非常多根本就是原话好吧。好啦,闲话不多说了。以下開始正题!

重点回想

===============================================================================

这一章是讲向量代数的。相信读过高中的人都可以非常easy理解(可能除了后面的代码部分以外)。这一章也引进了XNA Math 库,这是与“龙书”第二版不同的。当然我们仍然可以像在“龙书”第二版中那样使用D3DX数学库,只是这个XNA Math 库更加有效率;况且,通过这样引入新东西,Frank D. Luna给了我们一个当头棒喝。让我们从一開始就知道这本书和“龙书”第二版是非常不一样的。

为了方便,先把本章的学习目标列在这里:

1、 To learn how vectors are represented geometricallyand numerically.(学会怎样用几何方法和数值方法表示向量。)

2、 To discover the operations defined onvectors and their geometric applications.(学习定义在向量上的运算。以及它们的几何应用。)

3、 To become familiar with the XNA Mathlibrary’s vector functions and classes.(熟悉XNA Math库的向量函数以及类。)

这一章的内容。除开后面的代码部分。大部分是和“龙书”第二版的第一章知识重合的。

并且内容都非常easy。所以我就挑几个不同的地方说一下。

1.3.1 Orthogonalization (正交化)

这一小节中提到了Gram-Schmidt正交化方法,这在不论什么一本线性代数(或者高等代数)教材中都能够找得到。

1.4.1 Pseudo 2D Cross Product(伪2D叉积)

事实上这里并没有明白地提出这个概念(后面也没有涉及)。仅仅是说一个2D向量u的伪叉积v与该向量平行。事实上还应该加上一个条件,就是从u到v的叫是正角(只是怎样定义一个角的正负,这还跟坐标系的左右手性相关)。整体来说。这一小节是无足轻重的。

1.4.2 Orthogonalization with theCross Product(用叉积来正交化)

这一小节也是“龙书”第二版所没有的。这里的内容比較简单。是和1.3.1节并行的。

只是与那一小节不同。那里的Gram-Schmidt正交化方法是针对随意有限多个(线性无关的。只是此书并没有讲述这个线性代数中的概念,并且也不是一时半会儿可以讲清楚的,可是我想大家应该都学过这方面的知识了,应该非常easy理解)向量进行的,而这一小节是针对3个线性无关的3D向量而提出的第二种正交化方法。

1.6节XNA MathVectors(XNA Math向量)

这是全新的一节了。

这一节告诉我们,DX 11的D3DX库不再有一个提供各种向量运算的数学库了。相反。DX 11提供给我们的是XNA Math库。在Windows 平台上,XNA Math 库使用SSE2(Streaming SIMD Extension 2)指令集。

反正SIMD 能够用一个指令来完毕对4个32位的浮点数或整数的操作。所以,用这个库来做向量运算时是很快的。

只是值得注意的是。我们要将2D和3D向量先扩充成4D向量以便运用这样的高效计算的技术。以下详细讲述这一节的各个小节的重点内容:

1.6.1 Vector Types

这一小节中。作者总结了以下五点:

1、 对局部变量和全局变量,使用XMVECTOR类型。

2、 对类的数据成员,使用XMFLOAT2, XMFLOAT3和XMFLOAT4数据成员;

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

4、 用XMVECTOR的实例进行计算;

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

1.6.2 Loading and Storage Methods

这一小节中,作者介绍了上面提到的加载和存储函数。这里面出现了FXMVECTOR类型的參数;不用操心。以下就会进行解释的。

1.6.3 Parameter Passing

这一小节介绍了CXMVECTOR 和FXMVECTOR 这两种參数类型。并告诉了我们在定义函数时。參数类型的注意事项:

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

1.6.4 Constant Vectors

这一小节告诉我们,须要初始化的XMVECTOR常量应该定义为XMVECTORF32类型(用于存储浮点向量)或XMVECTORU32类型(用于存储整数向量)。

1.6.5 Overloaded Operators

这一小节介绍了非常多XMVECTOR重载的运算符。

这一节没什么好说的,只是你能够通过定义XM_NO_OPERATOR_OVERLOADS来取消这些重载。之所以会想到要取消这些重载,是由于在复杂的计算中。取消重载能够提高性能。

只是在此书中我们会一直使用这些重载运算符的(也就是说我们不会进行非常复杂的计算)。

1.6.6 Miscellaneous

不知道怎么翻译这个词。这一小节告诉了我们一些跟圆周率有关的常数、在弧度制和角度制之间进行转换的函数以及两个取最大最小值的宏。

1.6.7 Setter Functions

这一小节介绍了XNA Math库提供的一些设置一个XMVECTOR变量的值的函数,并给出了一个简单的控制台程序来演示之。

1.6.8 Vector Functions

这一小节介绍了一些做各种向量运算的函数。并给出了一个控制它程序来进行測试。

这里值得注意的有一点:全部的这些函数,假设返回值不是BOOL或者VOID的话。那么必定是XMVECTOR,包含返回一个浮点值的点乘函数。

1.6.9 Floating-Point Error

这一节讲了比較著名的问题:用浮点数进行计算(甚至单纯地表示)时,会出现误差,所以等推断相等时。须要定义一个容许误差。然后作者写了一个使用了XMVECTOR 的控制台程序来验证自己所说的。

此外。“龙书”第二版1.5节就提到了坐标变换,可是这本书第一章并没有提到这种话题,而是放在第3章中讲述。

===============================================================================

勘误:

===============================================================================

1、  在1.6.2 小节中,作者给出了几个函数,当中有的參数是FXMVECTOR类型的,可是这样的语法在下一小节才讲到。

刚開始学习的人可能会感到困惑。作者应该在这里提一下。

===============================================================================

 

习题解答:

===============================================================================

   习题1-18:

这些题目都非常easy,学过线性代数的同学都可以非常轻易地做出来。所以我就略过了。

习题19:

这一题展示了一个使用了XMVECTOR 的控制台程序,并让我们推測当中用到的XMVECTOR 函数的作用。

大部分都非常easy。我就挑几个说说吧!

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

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

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

XMVectorExp(v)   ——返回一个向量(2^v[0],2^v[1], 2^v[2], 2^v[3]),当中2^x表示2的x次幂。

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

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)或者1(x>1)。

===============================================================================

好啦,这期就到这里啦。下一期我们继续学习第2章的内容。

对了,原书的DVD附送了部分习题的解答,我就放在这里了,欢迎大家下载!

部分习题答案下载地址

另外我把前三章的彩图放在这里了,大家能够看看:

前三章彩图下载地址

版权声明:本文博主原创文章。博客,未经同意不得转载。