旁观OpenGL里的透视投影矩阵

一笑奈何 提交于 2020-02-06 11:58:04

OpenGL里的代码已经形成和使用了好多年,从程序员的角度,对OpenGL底层代码做升级或修改的实际意义并不大,而且风险高。所以,修改底层算法的想法是有些太狂了。但是,从教学的角度、提供一种新的视角去理解、或者重新再解读前人代码字里行间潜在的、独立于代码作者的理解而存在的深意,应该是值得探讨探讨的。这就是旁观了,观棋不语真君子,实在手痒拿起棋子、自己从头用代码把等价的功能重新实现一遍,或者是可能的。

我记得当年刚学Turbo Pascal /Turbo C 2.0编写几何变换程序的时候,我感觉 “平行投影”、尤其三维空间里向xOyxOy坐标平面的正平行投影是毫无意义、根本不需要存在的,而且我自己也完全没有意识到它存在就已经开始画图了。因为获得三维的点坐标(x,y,z)(x,y,z)之后,直接从代码里面拿(x,y)(x,y)的数据来用就是了,谁还管它投影不投影?头晕不头晕、麻烦不麻烦?

从很多国内搞图形学的研究者们发表的文章里来看,即使认识到齐次坐标和齐次矩阵表示几何变换的重要性和有用性,大家也一直并不严格区分降秩的投影和非降秩的几何变换。所以,概念的理解上至少在不少实用派的人的认识中实际是一直处于混乱状态,但这不意味着所有的人都糊涂。但糊涂的人多了,带着这种糊涂认识的文章,就能够轻松突破同行评审、登上期刊发表,以讹传讹、谬种流传。

不论国内还是国外,搞相关工作的专家,都忙于出看得到的成果,不太在意基础方面谬误的纠正。即使直到最近,2019年,英国一个老头出版的几何变换相关的计算机图形学参考书里面,还在用错误而且笨拙的观念。因为这种现状,让我对图形学很失望。我没有太多专门时间花在这个上面,加上基础并不扎实,所以纠错的声音很小、有时候类似民科的疯狂自我宣传。

国内代数射影几何相关的教学基本被压缩在选修和不修的角落里。看得到的北京师范大学的梅向明等人的《高等几何》已经第三版了,但是,因为局限于师范类大学的数学专业,而且太执着于“几何”本身,这就使得它在工程、图形学、计算机等方面的应用领域里的影响,微乎其微,可以忽略。老的专家已经老去,新的同学又没有开设的相关课程可学,对代数射影几何了解的人会不会出现断层?只剩下各自为政的,执着理论的和专注于实用的两大流派?

但是最近看了math.stackexchange.com上几个人(全是老外)的回答,让我又有了信心了。代数射影几何基础很好、实战经验很强、年轻和学历又好的人,原来还是很多,不只是少数几个很忙的顶级专家。所以,正常发展下去,正确的观点终将一统江湖,当然这需要时间、运气和推动。

一个我20年前就认识到的知识点,根据stereohomology自动借鉴和继承的“三透视”或“三透射”定理、或者可以理解为一种“变换群”,本质上的降秩的投影,可以通过满秩的space elation/ perspective和 再对变形体作降秩投影的复合而实现。这是OpenGL里 GLFrustum() 里的投影矩阵虽然是“满秩”的、但仍然好用的隐藏的理论根据。我感觉当初写代码的人未必真认识到这一点,他们很可能属于前述的“实用派”,否则在官方文档中就不至于语焉不详。这也是为什么程序员们在推导这个矩阵的时候无一不引用“透视投影”或“中心投影”这种原本“降秩”的矩阵操作。实际上降秩的矩阵跟其它矩阵相乘之后,无论如何得到的复合矩阵的秩都不大于这些矩阵因子中最小的秩,怎么可能得到GlFrustum()中类似的满秩矩阵呢?但大家被教的时候教科书编写者就以己昏昏使人昭昭,所以,稀里糊涂能用就行也就正常。

在这里插入图片描述
在代码中出现的很多magic number类似,不少应该都有理论依据,有优越性和局限性。但实用脱离系统的理论总结,可能导致某些累积的知识的失传。 我在某美资企业的时候碰到过类似的事情,有一个事关设备标定的算法,因为老工程师退休,新接替的人读文档出现误解,导致同一个设备、同样方法标定,出现巨大的偏差,却发现不了原因(但设备仍然好用)。这是知识传承中的断层。但图形学或计算机领域如此活跃,荟萃了太多精英,应该不会出现这种情况,顶多局部或大面积出问题,而不会把问题出在每一个角落。对人类认识的全体是小问题,对一个公司或局部,可能是理论上看来的本质性的错误。

躲在家里数日不出门,随便发些牢骚。

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!