学习下OpenGL里的投影函数1【如果csdn markdown支持PSTricks,PGF/Tikz插图就好了】

因为想要弄明白为什么在我看来理论和逻辑上优越、使用起来方便直观且简单的stereohomology不容易被接受和采用,我特意关注了应用领域里引用或使用极其广泛的OpenGL,其中的投影函数的背后的原理,但是看上去的确应该是让人比较头大的,没有找到通俗的说明文档。

——我是这么想的,如果未来升级了的OpenGL中几何变换和投影的算法借鉴了·stereohomology·的定义,可能它的算法实现的原理在学习者看来会更直观或者更简单容易理解?但对OpenGL当前的实在缺乏了解,打算浮光掠影地看一看相关知识点,看看到底有何优点和缺点。如果借鉴了新概念之后算法的空间或时间复杂度上无法做到起码能持平或相当的程度,则借鉴了又有什么实际意义?

另一方面,如果这些底层的算法一直不借鉴 stereohomology 的看法,那么,学习相关概念的程序员就得学习OpenGL之外,多学一种累赘,从实用的角度不经济,也就自然不会学习stereohomology, 不论后者多优越。这是一种惯性,无法抗拒。升级软件版本,尤其是较大升级的时候,必须保持向旧版本的兼容,这是类似的需要照顾用户习惯和经济性的问题。

所以我是从思想传播或市场接受规律的角度思考,作为一种中规中矩的、明显有优势的学术概念,stereohomology,为什么从从观点传播和接受的角度事实上却是失败的。先从自己的角度反省和找原因这个是自然的,因为从1998前后基本思路的产生,到现在已经20多年了,思想的不成熟、考虑不周全、数学表达的问题、中文和英语表达的问题、审稿的过程等等,都考虑了之后,再反省这些方面的问题。

我找OpenGL中关于投影的算法原理的时候,发现网络上有很多资源,国内的程序员们引用较多的是这个 添加链接描述

但我是抱着批判的态度学习的,不想花太多功夫实现,我更喜欢这个
添加链接描述,引言是这样写的:

Perspective projection is a well-understood aspect of 3D graphics. It is not something that 3D programmers spend much time thinking about. Most OpenGL applications simply select a field of view, specify near and far clipping plane distances, and call gluPerspective or glFrustum. These functions suffice in the vast majority of cases.

看来人们一直以为这些概念well-understood无须研究了、更无须了解其它的新想法,这是无可避免的惯性。

But there are a few assumptions implicit in these. gluPerspective assumes that the user is positioned directly in front of the screen, facing perpendicular to it, and looking at the center of it. glFrustum generalizes the position of the view point, but still assumes a perspective rooted at the origin and a screen lying in the XY plane.

The configuration of the user and his screen seldom satisfy these criteria, but perspective projection remains believable in spite of this. Leonardo’s The Last Supper uses perspective, but still appears to be a painting of a room full of people regardless of the position from which you view it. Likewise, one can still enjoy a movie even when sitting off to the side of the theater.

我用谷歌翻译快速处理了下,不确定准确性,但是这个工具效率高,词汇量大,有些时候翻译的效果让人喜出望外,比我心目中的那个版本可能都好。所以,下面我偷懒直接用,无视那些翻译得不通顺不靠谱的部分。

透视投影是3D图形的一个很好理解的方面。 3D程序员不需要花很多时间思考。大多数OpenGL应用程序仅选择一个视野,指定近和远裁剪平面的距离,然后调用gluPerspectiveglFrustum。这些功能在大多数情况下就足够了。

但是其中有一些隐含的假设。 gluPerspective假定用户位于屏幕正前方,垂直于屏幕并注视屏幕中心。 glFrustum泛化了视点的位置,但仍假定透视图以原点为根并且屏幕位于XY平面中。

用户及其屏幕的配置很少满足这些条件,但是尽管如此,仍然可以相信透视投影。莱昂纳多(Leonardo,就是达芬奇,不是小李子)的《最后的晚餐》使用了透视图,但无论您从哪个位置观看,它似乎仍然是一堆满是人的房间的画。同样,即使坐在剧院旁,人们仍然可以欣赏电影。

其中的定义和图片更容易获取原始代码,比如 P P P矩阵,鼠标悬停的时候,自动出现 L a T e X LaTeX LaTeX代码,我就忍不住在英文版Firefox里面鼠标右键菜单 Inspect Element(Q)了一下,直接找到代码贴到下面

title="P=\left[\begin{array}{cccc} \displaystyle\frac{2n}{r-l}& 0& \displaystyle\quad\frac{r+l}{r-l}& 0\\[10pt] 0& \displaystyle\frac{2n}{t-b}& \displaystyle\quad\frac{t+b}{t-b}& 0\\[10pt] 0& 0& \displaystyle-\frac{f+n}{f-n}& \displaystyle-\frac{2fn}{f-n}\\[10pt] 0& 0& -1& 0 \end{array}\right]"

代码显示出来是下面这种友好的形式,说明复制过来也方便,无须编辑太多。作者在贴svg矢量图片的同时,把图片标题用 L a T e X LaTeX LaTeX代码给出,实在是聪明!——这样的程序员才是需要学习的。仔细读完整的文档,作者是在批判地使用这个矩阵的。因为OpenGL代码已经这样了,了解它的优缺点、局限性,有利于更好使用。

P = [ 2 n r − l 0 r + l r − l 0 0 2 n t − b t + b t − b 0 0 0 − f + n f − n − 2 f n f − n 0 0 − 1 0 ] P=\left[\begin{array}{cccc} \displaystyle\frac{2n}{r-l}& 0& \displaystyle\quad\frac{r+l}{r-l}& 0\\[10pt] 0& \displaystyle\frac{2n}{t-b}& \displaystyle\quad\frac{t+b}{t-b}& 0\\[10pt] 0& 0& \displaystyle-\frac{f+n}{f-n}& \displaystyle-\frac{2fn}{f-n}\\[10pt] 0& 0& -1& 0 \end{array}\right] P=rl2n0000tb2n00rlr+ltbt+bfnf+n100fn2fn0
我根据stereohomology的代数表述,验证了下它的特征值,发现4个互不相同的特征值,显然不是我心目中的投影矩阵。了解到参数的物理意义之后,更加觉得从底层代码实现的角度,OpenGL算法实在务实得离谱。

其它公式,对齐方式这类不支持,需要修改

title="p_a=\left[\begin{array}{r@{}l} -1.&5\\ -0.&75\\ -18.&0\end{array}\right] \qquad p_b=\left[\begin{array}{r@{}l} 1.&5\\ -0.&75\\ -18.&0\end{array}\right] \qquad p_c=\left[\begin{array}{r@{}l} -1.&5\\ 0.&75\\ -18.&0\end{array}\right]"

改为:

p_a=\left[\begin{array}{rl} -1.50\\ -0.75\\ -18.00\end{array}\right] \qquad p_b=\left[\begin{array}{rl} 1.50\\ -0.75\\ -18.00\end{array}\right] \qquad p_c=\left[\begin{array}{rl} -1.50\\ 0.75\\ -18.00\end{array}\right]

p a = [ − 1.50 − 0.75 − 18.00 ] p b = [ 1.50 − 0.75 − 18.00 ] p c = [ − 1.50 0.75 − 18.00 ] p_a=\left[\begin{array}{rl} -1.50\\ -0.75\\ -18.00\end{array}\right] \qquad p_b=\left[\begin{array}{rl} 1.50\\ -0.75\\ -18.00\end{array}\right] \qquad p_c=\left[\begin{array}{rl} -1.50\\ 0.75\\ -18.00\end{array}\right] pa=1.500.7518.00pb=1.500.7518.00pc=1.500.7518.00

v_r = \frac{p_b-p_a}{||p_b-p_a||}\quad v_u = \frac{p_c-p_a}{||p_c-p_a||}\quad v_n = \frac{v_r\times v_u}{||v_r\times v_u||}

v r = p b − p a ∣ ∣ p b − p a ∣ ∣ v u = p c − p a ∣ ∣ p c − p a ∣ ∣ v n = v r × v u ∣ ∣ v r × v u ∣ ∣ v_r = \frac{p_b-p_a}{||p_b-p_a||}\quad v_u = \frac{p_c-p_a}{||p_c-p_a||}\quad v_n = \frac{v_r\times v_u}{||v_r\times v_u||} vr=pbpapbpavu=pcpapcpavn=vr×vuvr×vu

官方网站上的说明应该是最权威的,但是语焉不详。可能需要看代码、自己实现运行看看效果,感觉效率太低。

我还是先看了看CSDN博客上的文章,感觉还是有作者对这些概念的理解很清楚的,而且表达方面也不是人云亦云直接翻译:这就是把别人的知识真正转化成了自己知识的结果,比如这里的匿名网友写的 。看完这个,我立马明白,如果从stereohomology概念的角度出发,所谓的OpenGL里面的“投影矩阵”,实际上对坐标系的依赖性强、而且是一个多个“初等”几何变换的复合变换矩阵:它是3D坐标系下的、投影平面和 z z z 轴垂直的一个特殊中心投影(central projection),和一个位似中心在near clip plane上的3D中心相似(central dilation)的复合,这样就好理解了。其局限性也因此存在。

如果参数中涉及视口(viewport)相关的数据,则就超出了纯粹几何变换所要研究的范畴,就不是我关心的了。

按照这种思路,不考虑视口的宽度、高度的因素,两种几何变换复合得到的就是下面矩阵,跟OpenGL里面定义的看上去何其相似!但是这个矩阵是降秩的,秩为3.
[ 1 0 0 0 0 1 0 0 0 0 ( f − 1 ) s 2 + n n − s 1 − s 1 ( ( f − 1 ) s 2 + n ) n − s 1 0 0 f n − s 1 − f s 1 n − s 1 ] \color{cyan}\left[ \begin{array}{cccc} 1 & 0 & 0 & 0 \\[10pt] 0 & 1 & 0 & 0 \\[10pt] 0 & 0 & \dfrac{(f-1){s_2}+n}{n-{s_1}} & -\dfrac{{s_1} ((f-1) {s_2}+n)}{n-{s_1}} \\[15pt] 0 & 0 & \dfrac{f}{n-{s_1}} & -\dfrac{f{s_1}}{n-{s_1}} \\[15pt] \end{array} \right]\\[0pt] 1000010000ns1(f1)s2+nns1f00ns1s1((f1)s2+n)ns1fs1
但这显然不是目的。目的是一定要得到一模一样的结果。这里只是初步尝试一下是否有这么简单,请无视。

这样一来,用中心位似不足以表达两个相互垂直方向上可能不同的放缩,所以,应该是复合两个不同方向的比例变换(scaling), 比例系数是视口宽度或高度与2的比值,也就是令 λ = 1 \lambda=1 λ=1的简化形式写出来的scaling的特征值满足 ρ λ = ρ = t − b 2 \color{cyan}\dfrac{\rho}\lambda=\rho=\dfrac{t-b}2 λρ=ρ=2tb ρ λ = ρ = l − r 2 \color{cyan}\dfrac{\rho}\lambda=\rho=\dfrac{l-r}2 λρ=ρ=2lr. 这里也只是思路中可以忽略的部分。

然而,实际上,我发现,这里推导OpenGL投影矩阵的方法,是无法用stereohomology 相关的结果描述的。比如,如果真的第一步是一个透视投影或中心投影,那么矩阵因子是一个降秩的rank=3的因子,跟其他矩阵复合,不可能得到满秩的OpenGL投影矩阵,后者还可以求出逆矩阵。但是推导一下,深入了解一下、顺便印证一下自己的知识点,在2019新冠状病毒型肺炎疫情比较严重的几天,也是消磨时间的一种途径,虽然我还要写作业。好的,按照这里推导OpenGL投影矩阵的方法或数学原理,我翻译成stereohomology语言得到的矩阵是这样的:
[ 1 0 0 0 0 1 0 0 0 0 1 − f 0 0 0 1 ] ⋅ [ 1 0 0 0 1 0 0 0 0 0 0 1 ] ⋅ [ 1 l − r 0 l r − l + 1 2 0 1 b − t b t − b + 1 2 0 0 − 1 2 ] ⋅ [ 1 0 0 0 0 1 0 0 0 0 0 1 ] ⋅ [ 1 0 0 0 0 1 0 0 0 0 1 0 0 0 − 1 n 0 ] \small \left[ \begin{array}{cccc} 1 & 0 & 0 & 0 \\[10pt] 0 & 1 & 0 & 0 \\[10pt] 0 & 0 & 1 & -f \\[10pt] 0 & 0 & 0 & 1 \\[10pt] \end{array} \right]\cdot\left[ \begin{array}{ccc} 1 & 0 & 0 \\[10pt] 0 & 1 & 0 \\[10pt] 0 & 0 & 0 \\[10pt] 0 & 0 & 1 \\[10pt] \end{array} \right]\cdot\left[ \begin{array}{ccc} \dfrac{1}{l-r} & 0 & \dfrac{l}{r-l}+\dfrac{1}{2} \\[10pt] 0 & \dfrac{1}{b-t} & \dfrac{b}{t-b}+\dfrac{1}{2} \\[10pt] 0 & 0 & -\dfrac{1}{2} \\[10pt] \end{array} \right]\cdot\left[ \begin{array}{cccc} 1 & 0 & 0 & 0 \\[10pt] 0 & 1 & 0 & 0 \\[10pt] 0 & 0 & 0 & 1 \\[10pt] \end{array} \right]\cdot\left[ \begin{array}{cccc} 1 & 0 & 0 & 0 \\[10pt] 0 & 1 & 0 & 0 \\[10pt] 0 & 0 & 1 & 0 \\[10pt] 0 & 0 & -\dfrac{1}{n} & 0 \\[10pt] \end{array} \right] 10000100001000f1100001000001lr1000bt10rll+21tbb+212110001000000110000100001n10000
(我解释下上面这几个矩阵因子,虽然这些数学基础知识并不难,目前看来,套用Donald Trump总统的一句话,我尊重事实再加一个修饰限定状语“ 到 此 刻 为 止 \color{darkblue}到此刻为止 ”:“ 没 有 人 比 我 更 懂 \color{blue}没有人比我更懂 stereohomology”语言,因为大家都还没去学。好的,开始。从最右到最左,依次是(1)投影中心在原点、投影平面在近裁切平面 z = − n z=-n z=n的中心投影;(2)为了在平面上实现从投影平面区域 [ l , r , t , b ] [l,r,t,b] [l,r,t,b]到视口 [ − 1 , 1 , − 1 , 1 ] [-1,1,-1,1] [1,1,1,1]的几何变换,把投影之后平面上3D点的坐标直接放到和 z = − n z=-n z=n平行的 z = 0 z=0 z=0上并以 z z z轴与平面交点为原点建立平面坐标;(3)是一个平面上的射影变换,由四条直线 [ l , r , t , b ] [l,r,t,b] [l,r,t,b] [ − 1 , 1 , − 1 , 1 ] [-1,1,-1,1] [1,1,1,1]之间的一一对应而得到,具体的操作是射影几何基本定理的简化模式,解 3 × 3 3\times 3 3×3的非齐次线性方程组把第四直线的齐次坐标用其它三个表出,得到组合起来的两个 3 × 3 3\times 3 3×3直线齐次坐标矩阵,通过它们两个的转置、求逆、相乘操作,可以得到平面上的 3 × 3 3\times 3 3×3点射影变换,满足所需的从投影区域到设备视口区域的变换,具体的操作可以参考这里的高赞、被提问者接受了的回答里面的描述;(4)后面的两个在我看来本无必要,这也是产生推导差异的主要地方,如果只有平面坐标是有意义的,这里的信息就是“冗余”,但这个对应于投影的升维;(5)升维之后的3D点在过原点的坐标平面上,把它们平移到所需的平面上)上面几个矩阵依次相乘得到如下结果:

= [ 1 r − l 0 − l + r 2 l n − 2 n r 0 0 1 t − b − b + t 2 b n − 2 n t 0 0 0 f 2 n 0 0 0 − 1 2 n 0 ] ≈ [ 2 n ( t − b ) 0 ( b − t ) ( − l − r ) 0 0 2 n ( r − l ) ( b + t ) ( r − l ) 0 0 0 f ( b − t ) ( l − r ) 0 0 0 ( b − t ) ( r − l ) 0 ] =\left[ \begin{array}{cccc} \dfrac{1}{r-l} & 0 & - \dfrac{l+r}{2 l n-2 n r} & 0 \\[10pt] 0 & \dfrac{1}{t-b} & - \dfrac{b+t}{2 b n-2 n t} & 0 \\[10pt] 0 & 0 & \dfrac{f}{2 n} & 0 \\[10pt] 0 & 0 & - \dfrac{1}{2 n} & 0 \\[10pt] \end{array} \right]\approx \left[ \begin{array}{cccc} 2 n (t-b) & 0 & (b-t) (-l-r) & 0 \\[10pt] 0 & 2 n (r-l) & (b+t) (r-l) & 0 \\[10pt] 0 & 0 & f (b-t) (l-r) & 0 \\[10pt] 0 & 0 & (b-t) (r-l) & 0 \\[10pt] \end{array} \right] =rl10000tb1002ln2nrl+r2bn2ntb+t2nf2n100002n(tb)00002n(rl)00(bt)(lr)(b+t)(rl)f(bt)(lr)(bt)(rl)0000
≈ [ 2 n r − l 0 r + l r − l 0 0 2 n t − b t + b t − b 0 0 0 f 0 0 0 − 1 0 ] \approx \left[ \begin{array}{cccc} \dfrac{2 n}{r-l} & 0 & \dfrac{r+l}{r-l} & 0 \\[10pt] 0 & \dfrac{2 n}{t-b} & \dfrac{t+b}{t-b} & 0 \\[10pt] 0 & 0 & f & 0 \\[10pt] 0 & 0 & -1 & 0 \\[10pt] \end{array} \right] rl2n0000tb2n00rlr+ltbt+bf10000
而OpenGL里的投影矩阵是这样

P = [ 2 n r − l 0 r + l r − l 0 0 2 n t − b t + b t − b 0 0 0 − f + n f − n − 2 f n f − n 0 0 − 1 0 ] P=\left[\begin{array}{cccc} \displaystyle\frac{2n}{r-l}& 0& \displaystyle\quad\frac{r+l}{r-l}& 0\\[10pt] 0& \displaystyle\frac{2n}{t-b}& \displaystyle\quad\frac{t+b}{t-b}& 0\\[10pt] 0& 0& \displaystyle-\frac{f+n}{f-n}& \displaystyle-\frac{2fn}{f-n}\\[10pt] 0& 0& -1& 0 \end{array}\right] P=rl2n0000tb2n00rlr+ltbt+bfnf+n100fn2fn0

所以,从数学的严格的角度看来,这个推导其实就是数字拼图猜谜技巧,不能算严格理论推导吧。关键是,如何理解这个OpenGL投影矩阵的真实意图、然后把这些意图准确地用数学原理再现推导过程。

同时,对比两个矩阵的时候,我发现矩阵的很多元素都是一致的;只是,这个广为引用的推导获得 OpenGL投影矩阵的过程,因为推导采用的类似数字拼图技巧的缘故,引入了一些“冗余”信息,比如矩阵是满秩的、非0元素多,这些意味着潜在的空间和时间复杂度稍高。如果这些冗余的信息从其实现意图的本身来看并不需要,而只需要这个推导里面所述的实质性内容,那么采用stereohomology语言或算法,改写OpenGL的部分内容可能是既不影响上层的调用、又能够从效率或效益的角度有些微改进的。

如果从拼图凑数技巧的角度,因为任何矩阵都是可以分解为“初等矩阵”因子的,所以,从stereohomology语言的角度,总是能够对这个GLFrustum()矩阵找到几何解释、而且这种分解并不唯一,也就是解释也不唯一。为了证明我的确懂 stereohomology 而且言之不虚,我下面给出一种分解、也就是GlFrustum()投影矩阵的“新解释”。它可以表示为下面矩阵连乘积的形式,除了中间一个红色的矩阵因子,因为之前特地求算过、射影几何意义已经很明确无须修改的之外,我把其它因子设定为Householder初等矩阵形式:

[ 1 0 0 0 0 1 0 0 0 0 − f + n ( f − n ) 2 0 0 0 0 1 ] ⋅ [ 1 0 0 0 0 1 0 0 0 0 1 − f 0 0 0 1 n ] ⋅ [ 2 l − r 0 0 1 + 2 l − l + r 0 2 b − t 0 1 + 2 b − b + t 0 0 1 0 0 0 0 − 1 ] \left[ \begin{array}{cccc} 1 & 0 & 0 & 0 \\[10pt] 0 & 1 & 0 & 0 \\[10pt] 0 & 0 & - \dfrac{f+n}{(f-n)^2} & 0 \\[10pt] 0 & 0 & 0 & 1 \\[10pt] \end{array} \right]\cdot\left[ \begin{array}{cccc} 1 & 0 & 0 & 0 \\[10pt] 0 & 1 & 0 & 0 \\[10pt] 0 & 0 & 1 & -f \\[10pt] 0 & 0 & 0 & \dfrac{1}{n} \\[10pt] \end{array} \right]\cdot{\color{red}\left[ \begin{array}{cccc} \dfrac{2}{l-r} & 0 & 0 & 1+ \dfrac{2 l}{-l+r} \\[10pt] 0 & \dfrac{2}{b-t} & 0 & 1+ \dfrac{2 b}{-b+t} \\[10pt] 0 & 0 & 1 & 0 \\[10pt] 0 & 0 & 0 & -1 \\[10pt] \end{array} \right]} 1000010000(fn)2f+n0000110000100001000fn1lr20000bt20000101+l+r2l1+b+t2b01 ⋅ [ 1 0 0 0 0 1 0 0 0 0 1 0 0 0 − 1 n 1 ] ⋅ [ 1 0 0 0 0 1 0 0 0 0 1 − f − n f + n 0 0 0 − f − n n ( f + n ) ] ⋅ [ 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 2 f ] \cdot\left[ \begin{array}{cccc} 1 & 0 & 0 & 0 \\[10pt] 0 & 1 & 0 & 0 \\[10pt] 0 & 0 & 1 & 0 \\[10pt] 0 & 0 & - \dfrac{1}{n} & 1 \\[10pt] \end{array} \right]\cdot\left[ \begin{array}{cccc} 1 & 0 & 0 & 0 \\[10pt] 0 & 1 & 0 & 0 \\[10pt] 0 & 0 & 1 & - \dfrac{f-n}{f+n} \\[10pt] 0 & 0 & 0 & - \dfrac{f-n}{n (f+n)} \\[10pt] \end{array} \right]\cdot\left[ \begin{array}{cccc} 1 & 0 & 0 & 0 \\[10pt] 0 & 1 & 0 & 0 \\[10pt] 0 & 0 & 1 & 0 \\[10pt] 0 & 0 & 0 & 2 f \\[10pt] \end{array} \right] 10000100001n1000110000100001000f+nfnn(f+n)fn1000010000100002f

≈ P = [ 2 n r − l 0 r + l r − l 0 0 2 n t − b t + b t − b 0 0 0 − f + n f − n − 2 f n f − n 0 0 − 1 0 ] \approx P=\color{blue}\left[\begin{array}{cccc} \displaystyle\frac{2n}{r-l}& 0& \displaystyle\quad\frac{r+l}{r-l}& 0\\[10pt] 0& \displaystyle\frac{2n}{t-b}& \displaystyle\quad\frac{t+b}{t-b}& 0\\[10pt] 0& 0& \displaystyle-\frac{f+n}{f-n}& \displaystyle-\frac{2fn}{f-n}\\[10pt] 0& 0& -1& 0 \end{array}\right] P=rl2n0000tb2n00rlr+ltbt+bfnf+n100fn2fn0

也就是说,拼凑数字其实并不复杂。关键是几何解释是不是具有数学的合理性,同时,希望能够尽可能简单。

有人说(包括songho.ca和国内很多OpenGL程序员在博客上这么认为),保留GlFrustum()投影矩阵中第三行的两个非零元素,可以确保经过“透视变换”之后保留点的“深度”信息、做插值渲染之类的用得着。
在这里插入图片描述 根据这里我分解出来的五、六个矩阵因子,以及我对这些矩阵几何意义的理解,我可以负责任地告诉大家,如果只是出于这个目的,那么完全可以直接使用原始点坐标的、原始点坐标中的“z-坐标”不作任何变换、直接作为该点变换后的“深度”信息使用。这样一来可以省掉两个多余的投影矩阵中的元素(用我前面一种推导就可以得到投影矩阵‘、数学原理上完全合理了),二来省掉了计算量和存储新的计算结果的空间,而且这样并不会影响这些点深度信息的次序、趋势和连续性。也就是,如果深度信息的意义尽在一次,那么OpenGL的透视投影矩阵中,的确存在冗余信息、有改进的空间。

进一步,这个GLFrustum()中的透视投影矩阵,事先约定了“深度方向”或观察方向和z轴平行、而且观察点在原点 ( 0 , 0 , 0 ) (0,0,0) (0,0,0),这就不是普适的一般意义上的观察,有先天的局限性;此外,我听说OpenGL中还需要在“相机坐标系”、世界坐标系之间来回变换,听起来好像“相机”不在这个世界之中一样;实际上这种奇怪的居然需要两个相互独立的3D坐标系的现象的存在,正暴露了OpenGL代码形成的年代里、编程者们对几何变换规律认识上仍存在局限性。而采用stereohomology定义框架之下的几何变换的统一的、计算友好的重新解析定义、以及在此基础上的一些并不太难的引申工作,程序员有望较为轻易地实现更为一般意义上的、在统一的同一个三维世界坐标系下进行这些图形的变换、投影和操作。也就是说只需要一个三维坐标系,而且新手理解起来也更符合直观的规律、会更容易上手和使用。而只有在向NDC设备坐标系显示的时候,才的确需要一个虚拟的2D的数字图形空间里的新坐标系及相关的变换、这已经包含在前述推导中了。——如果在几何变换的概念形成为今天的局面之处,stereohomology或其等价的理论成果已经存在,不知道OpenGL、乃至OpenCV等图形学和视觉相关的理论架构,会是什么样一幅图景,会否仍然选择今天这种存在形式?这个很值我有时候得想象一下。

该从哪里获取更加权威的参照呢?或许编程序用一下?好吧,我继续从其它途径尝试理解OpenGL的投影矩阵是怎么回事。

草稿。更新中

这里写图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值