OpenGL 齐次坐标的妙用
非透视投影变换
非透视投影包括 R(旋转)、S(缩放)、T(位移)、虚拟摄像机变换、正视投影变换,所有的非透视投影变换 都是 R S T 组合而来的
位移变换
假设我们有一个向量代表一个物体
比如这样:
而矩阵运算
没有办法出现常数,所以我们就可以增加一个维度:
然后再使用一个 3×3 的矩阵来做变换
得到
这样我们就可以完成位移了,这个吧多出来的维度就叫齐次坐标。
同样我们统一使用齐次坐标来进行缩放和旋转,因为这样就可以一直保持向量是多一个维度的(也就是多出来的那个齐次坐标),直接相乘不用来回增减齐次坐标了。
缩放变换
旋转变换
三维物体变换
位移
缩放
旋转
透视投影变换
小孔成像
透视投影变换能够呈现出近大远小透视效果,更符合我们的视觉感受
透视投影模拟的是针孔摄像机,或者说小孔成像
小孔成像会在黑盒里的真空后面后面呈现一个倒立的图像,但是我们在计算机里可以将图像放在小孔前面,这样不仅可以避免图像颠倒,写代码的时候还会更直观
而且这个小孔的位置就可以成为我们的观察点
矩阵计算
然后我们就可以计算一下这个最终呈现的像的大小
如图所示,我们用相似可以简单推出
成像的
然而,矩阵运算是乘法和加法,没法很方便地计算除法
所以我们这里使用齐次坐标
最终将得到的向量除以
就得到了最终的答案,在成像位置不变的时候,
归一化:
- 可以看到,
会与 相乘,从而实现位移 会与 相乘,并加和在 分量上 左上角这个矩阵完成旋转- 主对角线完成缩放
齐次坐标的原理
将矩阵运算出来的向量分量除以
,并将 置为1(也可以减去 这个维度),这个过程叫做归一化
坐标
的 齐 次 坐 标 为 我们以三维物体投影到二维平面为例:
一个
坐标,映射到 的平面上 他的计算过程应该是这样的
先做归一化
,然后再翻到 的平面 ,最终得到了坐标
- Title: OpenGL 齐次坐标的妙用
- Author: lucas
- Created at : 2023-08-21 22:31:41
- Updated at : 2024-11-27 17:47:47
- Link: https://darkflamemasterdev.github.io/2023/08/21/OpenGL-齐次坐标的妙用/
- License: This work is licensed under CC BY-NC-SA 4.0.