想了想,大家一般会对什么感兴趣呢?好吧,那就说一下游戏中是怎么使用线性代数的。
之前,先说一下我学线性代数的经历。很可惜,当时学的时候,无论是老师和书上几乎没有提及任何应用场景,而且互联网也没有现在这么发达。导致最初只把它当做解线性方程组的一个工具而已,后来,学习了各种变换,其实也只会解题而已,完全不知道有什么实际作用。
毕业了以后,从我接触的领域来说,线性代数甚至比高等数学的应用场景还要多,也让我有机会对线性代数有了更深刻的认识。
不仅仅线性代数,其实对于我们在大学学的很多基础课,都很难理解实际的用处,比如《复变函数》等。将一门知识讲复杂了很容易,但是讲容易了的确是非常难的,这需要极高的学识和深刻的理解。
所以如果你有幸听到杨振宁讲物理,其实并不会因为他是诺贝尔奖得主,内容就变得生涩难懂,反而会更加生动有趣;
你看了《曼昆经济学》,什么人能把经济学讲的这么通俗易懂?原来曼昆29岁就成为了哈佛最年轻的终身教授之一;
如果你有幸有这样的老师教,那恭喜你!但现实是,很多学校的老师其实并没有达到这样的高度,所以更没法将一门复杂的学科联系实际并通俗易懂的讲出来。
如果在找了各种资料还是搞不懂一门学科的情况下,建议你,先默认接受这种状况。即使不理解,先好好学扎实了,课后的练习题先都会做了。以后工作中遇到相关的问题了,查资料解决问题的过程中,你自然而然就有了更深刻的理解。最悲催的莫不如,当你查了资料,发现我只记得”线性代数“这四个字,而里面的内容已经完全记不得了。
现在互联网如此发达,害怕的不是个别知识的“盲点”,而是“盲维”。因为“盲点”很容易借助互联网查到并解决,而“盲维”,指的是你缺失了整个维度,你可能需要从头学起,甚至不知道用什么关键词搜索。
我不是什么线性代数的大家,只是现实中经常用到,希望我的这篇回答能让你对《线性代数》这门课有一些深入的了解。
如果不会《线性代数》,连最基本的游戏场景都无法建立。
我们先来看一下下面的游戏场景
可以看到,上面的游戏场景和我们人眼看到的真实世界是一样的,远处的树显得比近处的要小,而小路在远处消失于一点,也就是符合我们眼睛中真实的世界——近大远小。
这里问题来了,游戏中的场景是如何设计的呢?不可能按照眼睛中近大远小的场景去设计,否则不同的视角下无法处理,所以一定是按照真实世界的大小去设计。那么我们玩游戏的时候,真实的世界是如何模拟我们的眼睛呈现出透视效果呢?我们先来看下图
我们的眼睛在看3D世界的时候,可以把眼睛想象成一个点,投射出一个视椎体,之所以呈现出近大远小,是因为在视椎体中,远处的物体投射到近平面会变小。那么真实世界中眼睛的这种透视效果怎么用数学进行表示呢?这时候,线性代数就表现出它强大的作用了。
这里其实就对应了一种变换,将视椎体框出的区域(截头方锥体)转换成一个标准立方体,经过这种变换,近平面的物体相对远平面就会变大。
为什么要转换成一个标准立方体呢?因为我们的显示器是2D的,GPU检测其中的深度信息,然后可以直接采样靠近近平面的点,也就是不被遮挡的点,这样显示出来的点就是真实的透视效果。否则,直接用视椎体,图像就会发生扭曲。
好了,上面都是定性的分析,那么怎么利用“线性代数”来进行这种变换呢?这里就涉及到了透视变换。
如果空间中一个点 ,如果按照如下顺序进行旋转
则转换后的点为 (在实际游戏中,我们常常不会使用欧拉角,因为会产生Gimbol Lock的问题,所以我们一般会使用四元数的方式来进行旋转。但是欧拉角的方式是最容易理解的)
如果进行平移呢?我们能否通过3x3的一个矩阵实现一个平移变换呢?
旋转是一个线性变换,如果把旋转想象成基底(我们可以先把基底想象成坐标系)的旋转,则在线性变换的过程中,原点不会发生变化。
但是平移变换会发生原点的变化,所以在3D空间中的线性变换无法达到平移的效果。那么我们如何利用线性变化达到旋转+平移(仿射变换)的效果呢?就是提高一维。
N维空间中的仿射变换可以转换成N+1维空间中的线性变换来实现。
所以我们首先要提高一维,首先将3维空间中的点提高成4维,然后利用线性变换达到平移的效果。
那么平移矩阵是什么呢?
其中 分别代表沿 轴移动的距离。
同理,上述旋转变换矩阵也得扩展成4维。
到此,我们知道了线性代数的知识可以帮助我们完成游戏场景的创建和场景中物体的移动。
你可能会说了,这里面的平移变换和旋转变换计算机会帮助我们处理,我们学习线性代数有什么作用呢?
计算机只是你思想的执行者,并不能帮助你思考。
在上面的游戏设计中,有下面两种变换方式
请问这两种变换结果是一样的吗?
如果你知道在矩阵乘法中 ,也就是不满足交换律,那么上面的问题,你可能不用过多思考就能给出答案。所以,掌握好线性代数基础非常重要。
如下图,游戏中有一个八卦阵,玩家控制的角色进入到八卦阵中,中间的怪兽立即发光。
如果你来设计这个游戏,如何检测一个角色进入到八卦阵中呢?试着将它简化为一个数学问题,把角色当成一个质点,就是如何判断一个点在一个八边形内?
更一般地,就是如何判断一个点在凸多边形内或凸多边形上?
看起来好像很简单,不就是在一个多边形内吗?其实这个还真不简单。这里涉及到计算机图形学的知识,当然有很多判断方法,这里介绍一种利用线性代数的方法。
如果点O在多边形内部(如下图),我们将多边形顶点A-G和O点连起来,组成有序向量 共7个向量。另外多边形的顶点顺时针连接,组成向量 也组成7个向量。
将上面两组向量两两配对,组成 共7组向量,我们看看每组向量有什么特点?是不是每组向量中的第1个向量都在第2个向量的顺时针方向?
比如 在 的顺时针方向, 在 的顺时针方向。也就是如果O点在多边形内部,则每组向量中的位置关系是固定的,即第1个向量在第2个向量的顺时针方向。而且这个条件是充要的。
再看下图,如果点O在多边形外部, 在 的顺时针方向,但是 却在 的逆时针方向,也就是说如果O点在凸多边形外,则每组向量中的位置关系是不固定的。
好了,那我们怎么表示这种顺时针的位置关系呢?这就用到了线性代数中的行列式。我们知道行列式的几何意义是什么吗?
如上图,我们有两个向量(1, 2), (-1, 1),组成的行列式为
这里面行列式的值就是由 组成的平行四边形的面积。
有人可能会有疑问,行列式有可能是负值,那么负值的含义是什么呢?于是我们将上面两个向量对调,重新组成行列式。
看到了吗,行列式的绝对值就是由两组向量组成的平行四边形的面积。而符号呢,代表了 的相对位置关系。
我们可以参考下面的右手定则,如果 在 的顺时针方向,则用行列式求出来的符号也就是叉乘出来的值就是正的,反之,符号就是负的。
所以,我们竟然可以用线性代数中行列式的正负来表示两组向量的位置关系,从而能够表示一个点是否在一个凸多边形内或凸多边形上,进而判断角色是否进入八卦阵中。是不是特别的神奇?
其实“线性代数”的用处远不止于此,在“图像处理”,“机器学习”等领域都有非常广泛的应用,但是对于学生我觉得游戏更能让大家提高兴趣。
所以我也没介绍什么太高深的知识,尽量用通俗易懂的语言和生动的案例让大家明白“线性代数”在实际中的用处,而且涉及到的都是线性代数最最基本的概念,希望能让对"线性代数"还有些"迷茫"的人有些帮助。
另外,无论是什么专业,在学习数学的时候,都试着将学到的数学知识和生活联系起来,你可能会发现,数学中很多的思维竟然能指导我们的生活,让我们养成结构化思考的习惯。具体内容请参见我的另一篇回答。
最后,如果这篇回答让你对“线性代数”有了一些更深刻的理解,请帮忙点赞,谢谢。