转载:https://blog.csdn.net/yinhun2012/article/details/80336487

之前我们学习了“顶点机器”变换顶点的一系列过程,其中就谈到了从眼睛空间到裁剪空间的裁剪变换,这篇我们就来学着推导一下这个裁剪变换,毕竟假如我们对于计算机知识只是像看小说看新闻一样,那其实没什么用,前一秒看完后一秒就忘记了。要亲自用纸和笔推导和多遍仔细阅读的记忆才能保证掌握了这个知识点。

首先我们来观察下我们要变换的眼睛仿射空间和裁剪仿射空间是个什么样子的,如下图:

咋一看就是near面伸缩到22的正方形,far面也伸缩成22的正方形,同时near和far面的距离伸缩到数值2的范围内,然后绕X轴180°逆时针旋转到Z轴反向(或者绕Y轴逆时针180°),最后平移到坐标系中心就得到结果了。

但是其中美中不足的地方就是near面和far面都处于在XY平面而且缩放后的大小都是22,也就是说near和far缩放不均匀,那么我们并不能用一个缩放矩阵搞定,这样的话我们必须推导出新的矩阵求解near和far以及其距离变换成222的立方体。

前面我们学习矩阵推导的时候,也了解到求解矩阵参数,无非是在矩阵T向量V = 向量V’的情况下,建立T和V的行列相乘=V’的分量的n元一次方程组,然后通过各种数学方法(三角函数几何向量等)预先得到向量V和向量V’,再反过来推导矩阵T的参数。如此一来我们就先来求出起码一对眼睛仿射空间和裁剪仿射空间的映射向量。先来随便取一个眼睛视椎体内的顶点坐标P(x,y,z),然后通过边视图和顶视图来观察,如下图:

ps:其中t(top)代表near面y轴正方向长度,b(bottom)代表y轴负方向长度,l(left)代表near面x轴负方向长度,r(right)代表near面x轴正方向长度,n(N)代表near面到坐标中心距离,f(F)代表far面到坐标中心距离。

我们先假设视椎体中有一点P,然后求出P点在视椎体near面的投影点P’,为什么要求出P’呢?主要是为了通过间接方式求出裁剪立方体空间near面上投影点Pv’,这样我们就得到最终映射点Pv的x,y分量,同时通过near面到far面的Z轴坐标插值求出depth[-1,1]区间的z值,进而得到最终P的映射点Pv(x,y,z)。接下来我们继续从裁剪立方体的near面观察同时从边视图观察得到depth,如下图:

上图我们通过插值计算出裁剪空间near面投影点Pv’的x、y分量,然后通过裁剪空间边视图计算出z(depth[-1,1])分量,然后组装出眼睛空间中P(x,y,z)的变换映射点Pv(Xv,Yv,Zv)。这时候我们就已经准备好了求解裁切矩阵T的两个已知量了。

接下来我们怎么构建变换矩阵T呢?其实还是通过线性方程组,同时我们还能直接得到观察线性方程组的参数值,如下图:

这里我们就算出了裁剪矩阵T的具体数值了,别急,我们还没结束,这里先抛出两个问题:

第一:我们还没使用程序计算推导的结果是否正确呢?这是因为篇幅长了点,我准备下一篇立刻开始根据这篇的计算结果进行程序验证!

第二:我们可以观察到推导出的矩阵T的数值中居然带有P(x,y,z)的z分量,这可是一个未知值!虽然我们程序可以直接传入z的值,但是这种矩阵并没有完全的“解耦”,我们写程序都追求低耦合,这里别慌,等我们验证完这个矩阵的正确性之后,我再使用fov(field of view)这个参数进行新的换算推导,得到新的“解耦”后的矩阵T。

线性代数:裁剪变换(投影变换)(一)相关推荐

  1. 线性代数-坐标系变换

    问题描述: 已知一个全局坐标系,还有若干局部坐标系,如何将局部坐标系的坐标转成全局坐标系的坐标?反过来又如何进行? 这里的坐标系都是直角坐标系. 本文通过下面几个方面的研究来回答上面的问题. 1.简单 ...

  2. 图形学-(视图变换,投影变换)

    1.视图变换 在 3 维物体变到二维平面的过程中,我们需要规定好相机的位置.对于相机所做的变换就是视图变换 (Viewing/Camera transformation). 我们需要对相机位置进行定义 ...

  3. 线性代数行变换与列变换

    https://zhidao.baidu.com/question/1449894716117350020.html?fr=iks&word=%C1%D0%B1%E4%BB%BB&ie ...

  4. OpenGL基础图形编程(八)变换

    八.OpenGL变换 OpenGL变换是本篇的重点内容,它包括计算机图形学中最基本的三维变换,即几何变换.投影变换.裁剪变换.视口变换,以及针对OpenGL的特殊变换概念理解和用法,如相机模拟.矩阵堆 ...

  5. 计算机图形学基础知识-三维变换

    原文: http://blog.sina.com.cn/s/blog_557d254601017gvz.html 变换是 计算机图形学中重要概念,包括最基本的三维变换,即 几何变换. 投影变换. 裁剪 ...

  6. 三维变换到二维投影_OpenGL版本

    转自:http://blog.sina.com.cn/s/blog_957b9fdb0100zesv.html 为了说明在三维物体到二维图象之间,需要经过什么样的变换,我们引入了相机(Camera)模 ...

  7. 【ArcGIS遇上Python】ArcGIS Python实现长时间序列遥感影像批量处理--以裁剪为例

    任务分析:在采用遥感方法研究植被物候变化时,需要下载长时间序列(本文用到的是30年)GIMMS 3G NDVI数据.原始数据是全球的,预处理过程包括几何校正.裁剪.投影变换.Hants时间序列谐波分析 ...

  8. 实验5 OpenGL模型视图变换

    1.实验目的: 理解掌握OpenGL程序的模型视图变换. 2.实验内容: (1)阅读实验原理,运行示范实验代码,理解掌握OpenGL程序的模型视图变换: (2)根据示范代码,尝试完成实验作业: 3.实 ...

  9. OpenCV中的「透视变换 / 投影变换 / 单应性」—cv.warpPerspective、cv.findHomography

    文章目录 引言 透视变换(projective transform) 单应性(Homography) opencv代码 仿射变换相关函数 投影变换相关的函数 鸟瞰图代码示例 小结 引言 图像的几何变换 ...

最新文章

  1. 接口测试要如何做数据准备
  2. 如何合并两个Docker 镜像
  3. python图像直方图与直方图均衡化
  4. [Android] 任意时刻从子线程切换到主线程的实现
  5. 使用ASP.NET Core 3.x 构建 RESTful API - 4.1 面向外部的Model
  6. wpf label字体为斜体_2020年趋势:20款流行字体大预测
  7. 7.1 XHTML的规范化
  8. vue引用jquery
  9. 大连IT产业解析(2人才篇)
  10. TP4056调试笔记
  11. JDT 随记---介绍
  12. 爱宝 A-80P 打印机驱动
  13. HaaS轻应用(JavaScript)总览
  14. 通过数据挖掘,我们研究了完美日记的两大增长策略
  15. SUMO/检测器设置(E3)学习总结
  16. 激活Anylogic操作步骤
  17. 昂达平板不能开机刷机_昂达平板电脑打不开机怎么办
  18. mahout java api_Mahout推荐算法API详解
  19. MyBatis选择Choose和条件IF用法
  20. 利用Python做一个简单的对战小游戏

热门文章

  1. 建模添加原子时出现以下错误
  2. WCP知识库 开源版 Win安装配置
  3. 小程序自定义底部导航 custom-tab-bar
  4. 五句话介绍Hessian序列化
  5. newman执行测试_Postman+Newman执行自动化测试
  6. Newman安装HTML report
  7. Qt获取CPU编号和硬盘序列号
  8. 华三 h3c Rip、静态路由、silent-interface配置
  9. MySQL从入门到精通:多表查询的灵活运用_02
  10. springBoot 用户头像的修改并及时显示