OpenGL 齐次坐标的妙用

OpenGL 齐次坐标的妙用

lucas Lv4

非透视投影变换

非透视投影包括 R(旋转)、S(缩放)、T(位移)、虚拟摄像机变换、正视投影变换,所有的非透视投影变换 都是 R S T 组合而来的

位移变换

假设我们有一个向量代表一个物体 ,然后我们想平移它

比如这样:

而矩阵运算

没有办法出现常数,所以我们就可以增加一个维度:

然后再使用一个 3×3 的矩阵来做变换


得到

这样我们就可以完成位移了,这个吧多出来的维度就叫齐次坐标。

同样我们统一使用齐次坐标来进行缩放和旋转,因为这样就可以一直保持向量是多一个维度的(也就是多出来的那个齐次坐标),直接相乘不用来回增减齐次坐标了。

缩放变换

旋转变换

三维物体变换

位移

缩放

旋转

透视投影变换

小孔成像

透视投影变换能够呈现出近大远小透视效果,更符合我们的视觉感受

透视投影模拟的是针孔摄像机,或者说小孔成像

小孔成像-computer.png

小孔成像会在黑盒里的真空后面后面呈现一个倒立的图像,但是我们在计算机里可以将图像放在小孔前面,这样不仅可以避免图像颠倒,写代码的时候还会更直观

而且这个小孔的位置就可以成为我们的观察点

矩阵计算

然后我们就可以计算一下这个最终呈现的像的大小

透视投影-计算.png

如图所示,我们用相似可以简单推出 是因为坐标 点的 ​ 轴坐标)

成像的 成反比,正好符合近大远小的规律

然而,矩阵运算是乘法和加法,没法很方便地计算除法

所以我们这里使用齐次坐标

最终将得到的向量除以 分量得到:

就得到了最终的答案,在成像位置不变的时候, 越小显示的图像越大,反之越小,三维物体也是同样的道理:

归一化:

  1. 可以看到, 会与 相乘,从而实现位移
  2. 会与 相乘,并加和在 分量上
  3. 左上角这个矩阵完成旋转
  4. 主对角线完成缩放

齐次坐标的原理

w分量.png

分量所表达的就是比例变换,可以看到图中的 的时候平移和 的位移距离完全不一样

将矩阵运算出来的向量分量除以 ,并将 置为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.
Comments