《Unity3D 实战核心技术详解》书中关于矩阵的错误
最近一直在学习实时渲染,不免要接触线性代数。而渲染中,一定会用到矩阵,当我再次去复习我之前看的书时,发现《Unity3D 实战核心技术详解》关于矩阵就有几处错误 ,特标注出来。
书的第一章《3D数学与Unity》,1.3.2讲矩阵缩放、1.3.3讲矩阵的旋转。缩放是一个矩阵,后面旋转针对绕三个不同的轴的旋转矩阵(x、y、z),总共4个矩阵,其中3个是错误的,只有一个绕y轴旋转是正确的。我不确定是印刷问题,还是作者本身对矩阵了解和掌握的就不深入,但出现这样的低级错误实属不该。
我直接上图片,不然口说无凭。


如第一张图所示,如果缩放的矩阵如书中所注,那么x’= x·Sx + y 而不是期望的 x.Sx,同理绕x轴旋转,那么x轴的坐标应当是不动的,也就是除了第一列的第一个为1外,其余应该为0,而第二行居然出现了1,那x’= x + y了,这根本就不是旋转了啊
,绕z轴旋转的就更离谱了…
好了,矩阵确实麻烦,但它却是理解和学习3D必不可少的知识。如果判断一个矩阵是否正确呢?这里我推荐《程序员的数学3 —— 线性代数》这本书中的一个方法,如下图所示。

注意看画线的部分,我正是掌握了书中这个简单的方法,再去看有“错误”的那本书的矩阵时,一眼就发现矩阵是错的。希望这个小技巧和方法能帮助到你:
将输入的列向量放倒,然后将对应的元素分别相乘。
再额外补充一句,我之前也看孟岩在CSDN上写的那三篇《理解矩阵》,里面提及的书有:
《数学:它的内容、方法和意义》
《线性代数五讲》
《数学概观》
《数学拾遗》
《重温微积分》
《计算机图形学 —— 几何工具算法详解》
因为作者非数学系的专业人士,所以它的描述可能存在不准确的地方,但那是他自己的理解,能帮助到不理解矩阵的人,我觉得也是很有价值的。毕竟大部分人只是需要了解矩阵到底是什么东东,好奇为什么要用矩阵呢,至于矩阵更深层次的研究可能就不是那么在意了。科普有科普的作用,专业有专业的必要。
其实我觉得关于矩阵,看维基百科上的定义已经写的很清晰、明了了,仔细研究透,也就有个大概的了解了。链接地址 https://zh.wikipedia.org/wiki/矩阵
那矩阵到底是什么,以我目前的理解和认知,矩阵就是映射,矩阵就是映射,矩阵就是映射(重要的事情说三遍!)。
这里推荐几个我觉得非常好的视频给大家,更直观,进一步降低学习门槛。
【官方双语/合集】线性代数的本质 - 系列合集(用直观的动画、简洁的语言来讲述线性代码,你值得观看!)
https://www.bilibili.com/video/av6731067/index_1.html
麻省理工公开课:线性代数
http://open.163.com/special/opencourse/daishu.html
Introduction to Linear Algebra, Fifth Edition(2016) —— 线性代数教程评价最高的书,没有之一
http://math.mit.edu/~gs/linearalgebra/
Linear Algebra Done Wrong (Sergei Treil)
https://www.math.brown.edu/~treil/papers/LADW/LADW.html
陶哲轩在UCLA的linear algebra讲义 (通过阮一峰的博客了解到,他是40岁以下最聪明的美国科学家,24岁便被聘为正教授)
http://www.math.ucla.edu/~tao/resource/general/115a.3.02f/
最后扯点题外话,买书尽量买豆瓣上评价高的或者官方出品的(有口碑和品质保障),不然反而被误导了,读书有风险,吸收需谨慎(也可以说尽信书不如无书)。
这里我推荐一本书:《游戏引擎架构》,写书的作者本身的品质有保障,译者的水平也是杠杠的。
虽然我指出书中关于矩阵部分的三个错误(点积那部分不知道是印刷错误还是什么原因,存在错误),但本书其它章节依旧值得去阅读,给出的代码也并不算复杂,毕竟作者长期奋战在一线,网上也有很多他录制的视频。更多是吸收他实战的经验,理论部分我建议泛泛看一看,再找本更专业(评价更高)的书去查阅,这本书的理论写的并不好。
《Unity3D 实战核心技术详解》书中关于矩阵的错误的更多相关文章
- Nginx高性能web服务器详解书中概要
一.Nginx功能 1.Nginx服务器以其功能丰富著称于世.它既可以作为HTTP服务器,也可以作为反向代理服务器或者邮件服务器;能够快速响应静态页面(HTML)的请求;支持FastCGI.SSL.V ...
- ARP缓存表的构成ARP协议全面实战协议详解、攻击与防御
ARP缓存表的构成ARP协议全面实战协议详解.攻击与防御 1.4.3 ARP缓存表的构成 在局域网的任何一台主机中,都有一个ARP缓存表.该缓存表中保存中多个ARP条目.每个ARP条目都是由一个IP ...
- 详解Objective-C中委托和协议
Objective-C委托和协议本没有任何关系,协议如前所述,就是起到C++中纯虚类的作用,对于“委托”则和协议没有关系,只是我们经常利用协议还实现委托的机制,其实不用协议也完全可以实现委托. AD: ...
- jQuery:详解jQuery中的事件(二)
上一篇讲到jQuery中的事件,深入学习了加载DOM和事件绑定的相关知识,这篇主要深入讨论jQuery事件中的合成事件.事件冒泡和事件移除等内容. 接上篇jQuery:详解jQuery中的事件(一) ...
- 【转】详解C#中的反射
原帖链接点这里:详解C#中的反射 反射(Reflection) 2008年01月02日 星期三 11:21 两个现实中的例子: 1.B超:大家体检的时候大概都做过B超吧,B超可以透过肚皮探测到你内 ...
- 详解Webwork中Action 调用的方法
详解Webwork中Action 调用的方法 从三方面介绍webwork action调用相关知识: 1.Webwork 获取和包装 web 参数 2.这部分框架类关系 3.DefaultAction ...
- 【转】详解JavaScript中的this
ref:http://blog.jobbole.com/39305/ 来源:foocoder 详解JavaScript中的this JavaScript中的this总是让人迷惑,应该是js众所周知的坑 ...
- 深入详解SQL中的Null
深入详解SQL中的Null NULL 在计算机和编程世界中表示的是未知,不确定.虽然中文翻译为 “空”, 但此空(null)非彼空(empty). Null表示的是一种未知状态,未来状态,比如小明兜里 ...
- java 乱码详解_jsp中pageEncoding、charset=UTF -8"、request.setCharacterEncoding("UTF-8")
http://blog.csdn.net/qinysong/article/details/1179480 java 乱码详解__jsp中pageEncoding.charset=UTF -8&quo ...
随机推荐
- 一起学Hadoop——使用IDEA编写第一个MapReduce程序(Java和Python)
上一篇我们学习了MapReduce的原理,今天我们使用代码来加深对MapReduce原理的理解. wordcount是Hadoop入门的经典例子,我们也不能免俗,也使用这个例子作为学习Hadoop的第 ...
- 一起学Hadoop——MapReduce原理
一致性Hash算法. Hash算法是为了保证数据均匀的分布,例如有3个桶,分别是0号桶,1号桶和2号桶:现在有12个球,怎么样才能让12个球平均分布到3个桶中呢?使用Hash算法的做法是,将1 ...
- python全栈开发day59-Django基础
一.今日内容总结 1.HTTP协议: 请求:浏览器发给服务端的消息 格式: 请求方法 URL 协议版本\r\n k1: v1\r\n k2: v2\r\n \r\n 请求体(请求数据) 响应:服务端返 ...
- Flask---第二个例子--Get和POST发送
*get:浏览器告诉服务器,我只需要获取页面信息给我,这是最简单最常用的方法 *Post:览器告诉服务器:想在 URL 上 发布 新信息.并且,服务器必须确保 数据已存储且仅存储一次.这是 HTML ...
- 004 使用SpringMVC开发restful API二--编写用户详情
一:编写用户详情服务 1.任务 @PathVariable隐射url片段到java方法的参数 在url声明中使用正则表达式 @JsonView控制json输出内容 二:@PathVariable 1. ...
- STL容器及泛型算法
一.顺序容器 1.容器的选择 (1) 随机访问,选vector ,deque (2) 在中间插入或者删除元素,选list (3) 在头尾插入或删除元素 , 选deque 2.list的成员函数 (1) ...
- Python class NameError name "xxx" is not defined
Python class NameError name "xxx" is not defined 这是因为在 class 中调用了带双下划线 "__" 的函数对 ...
- chrome刷新CSS
改动CSS发现页面根本没有变化,再三查看确实是这一处CSS,那么可能的就是浏览器缓存了CSS而刷新无效了. chrome刷新CSS: 方法1:直接ctrl+F5,进行强制刷新页面,浏览器会重新加载所有 ...
- 平衡二叉树的java实现
转载请注明出处! 一.概念 平衡二叉树是一种特殊的二叉搜索树,关于二叉搜索树,请查看上一篇博客二叉搜索树的java实现,那它有什么特别的地方呢,了解二叉搜索树的基本都清楚,在按顺序向插入二叉搜索树中插 ...
- Vue项目History模式404问题解决
本文主要解决Vue项目使用History模式发布到服务器Nginx上刷新页面404问题.(由于每个项目的情况都不尽相同,本方案已经完美解决本在所使用项目,具体情况可能还需要修改.) 1.项目背景分析 ...