实现OpenGL渲染器原理篇(四)——透视投影

实现OpenGL渲染器原理篇(四)——透视投影
最近在Github上复现了⼀个渲染器render的项⽬:
Github链接:tiny render
我希望在博客上可以记录⾃⼰的学习过程,博客主要分为两⼤类:《原理篇》和《语法篇》。
原理篇则主要讲的是——实现渲染器过程中所需要的算法知识。
语法篇则主要讲的是——实现渲染器过程中使⽤到的C++的语法知识。
⼀、The goal防水牛津布
在之前的3篇博客中,⼤家通过简单地忽略z坐标来渲染正投影模型。
也就是说,我们之前的⽬标是渲染⼀个正投影模型。
粗糙的布片今天的⽬标是如何画透视图:
The goal
我们现在完成透视图的绘制,最终可以完成全3D的渲染。
⼆、2D⼏何
2.1 线性转换
平⾯上的线性变换可以由相应的矩阵表⽰。
如果我们取⼀个点(x,y),那么它的变换可以写成下⾯这样:
变换1
最简单的(不是退化的)变换是单位矩阵,它⼀点都不会动。
变换2
矩阵的对⾓系数沿坐标轴缩放。
让我来说明⼀下,如果⼤家进⾏以下转换:
变换3
然后,⽩⾊物体(⼀个⾓被切掉的⽩⾊正⽅形)将变成黄⾊。
红⾊和绿⾊线段分别给出了与x和y对齐的单位长度向量:
展频⽩⾊object
我们为什么要⽤矩阵来解决问题呢?因为它很⽅便。
⾸先,在矩阵形式中我们可以像这样表⽰整个物体的变换:
变换矩阵
在此表达式中,变换矩阵与上⼀个矩阵相同,但是2x5矩阵就是我们的⽅形物体的顶点。
这⾥⽩⾊对象被转换为红⾊对象,然后转换为绿⾊对象,最后转换为蓝⾊对象(⽩⾊换红⾊的时候是x轴的移动,然后红⾊换绿⾊的时候是y轴的移动,绿⾊换为蓝⾊则⼜是x轴的移动):
但是这些都是复杂的细节,为了简单起见,可以直接编写⼀个旋转矩阵(⼤家都还记得预乘技巧吗?):
旋转矩阵
⼤家可以将矩阵以任何顺序相乘,但请记住,矩阵的乘法是不可交换的:
image.png
这下讲得通了: 先剪切⼀个物体,然后旋转它,与先旋转它,然后剪切它是不⼀样的!
先剪切⼀个物体,后旋转它,与先旋转它,后剪切它是不⼀样的!
上⾯两张图可以进⾏⽐较,⼤家可以看看。
三、2D仿射变换
因此,平⾯上的任何线性变换都是⽐例变换和剪切变换的组合。
这意味着我们可以做任何我们想做的线性变换,⽽原点,则永远不会移动!
是的,平移不是线性的。⼤家可以试着在完成线性部分后加上平移:
加号左边则是线性转换部分,加号右边则是平移
开关柜除湿
上⾯这个表达式也真的很酷,它告诉我们可以旋转、缩放、剪切和平移。
但是我们需要注意:我们的⽬标是组合多个转换。
下⾯的表达式则是两个转换的组合(记住,我们需要组合许多这样的转换):
括号中的左边是线性转换,右边是平移部分。下来对得到新的括号中的坐标,再进⾏第2轮线性变换,然后第2轮的平移变
⼤家需要明⽩⼀点,即使仅仅是单⼀的合成物,看起来也会很难看,那么如果后⾯添加更多的东西,看起来则会变得更糟。
四、齐次坐标
真空挤砖机好,下来带⼤家看看什么叫⿊科技。
管道内衬想象⼀下,我们要将⼀列纵⾏和⼀⾏横⾏添加到我们的转换矩阵中(因此使其变为3x3),并将⼀个始终等于1的坐标附加到将要转换的向量上:

本文发布于:2024-09-21 19:07:28,感谢您对本站的认可!

本文链接:https://www.17tex.com/tex/4/250935.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:转换   矩阵   变换   旋转   渲染器   过程   剪切   线性
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2024 Comsenz Inc.Powered by © 易纺专利技术学习网 豫ICP备2022007602号 豫公网安备41160202000603 站长QQ:729038198 关于我们 投诉建议