齐次坐标知识点: \(\begin{bmatrix} x \\ y \\ z \\ 1 \\\end{bmatrix} \Rightarrow\begin{bmatrix} nx \\ ny \\ nz \\ n \\\end{bmatrix}\) 两个都表示同一个点

透视投影:先将远截面按一定规则缩放到跟近截面一样大,然后再正交投影

缩放规则:远截面缩放后\(z\)不变,缩放过后大小同近截面相同。

截取yz平面,\(ZNear = n,ZFar = f\) ,则任意一点经过缩放后: \(y^{’} = \frac{n}{z}y\) (相似三角形)

xz平面同理: \(x^{’} = \frac{n}{z}x\) ,即 \(\begin{bmatrix} x \\ y \\ z \\ 1 \\\end{bmatrix} \Rightarrow\begin{bmatrix} \frac{n}{z}x \\ \frac{n}{z}y \\ unknown \\ 1 \\\end{bmatrix}\Rightarrow\begin{bmatrix}nx \\ ny \\ unknown \\ z \\\end{bmatrix}\)

如此可以确定一部分矩阵参数:

\(M_{persp\rightarrow ortho} = \begin{bmatrix} n & 0 & 0 & 0 \\ 0 & n & 0 & 0 \\ ... & ... & ... & ... \\ 0 & 0 & 1 & 0 \\\end{bmatrix}\)

对于近截面和远截面上的点,透视变换后z是不变的(缩放规则)

只看第三行的结果

\(\begin{bmatrix} A&B&C&D\\ \end{bmatrix} \begin{bmatrix} x \\ y \\ z \\ 1 \\\end{bmatrix} \Rightarrow z^2\)

显然 \(A = B = 0\) ,代入 \(Z = n ,Z = f\) 有

\(Cn+D = n^{2}\)

\(Cf+D = f^{2}\)

得到 \(C = n+f,D=-nf\)

最后求得

\(M_{persp\rightarrow ortho} = \begin{bmatrix} n & 0 & 0 & 0 \\ 0 & n & 0 & 0 \\ 0 & 0 & n+f & -nf \\ 0 & 0 & 1 & 0 \\\end{bmatrix}\)

课后问题:对于任意一个满足 \(n\leq z\leq f\) 的点,经过透视投影后, z 坐标相对于之前有什么变化

\(M_{persp\rightarrow ortho}\begin{bmatrix} x \\ y \\ z \\ 1 \\\end{bmatrix} \Rightarrow \begin{bmatrix} nx \\ ny \\ (n+f)z-nf \\ z\\\end{bmatrix}\Rightarrow \begin{bmatrix} \frac{n}{z}x \\ \frac{n}{z}y \\ \frac{(n+f)z-nf}{z} \\ 1\\\end{bmatrix}\)

比较 \(\frac{(n+f)z-nf}{z} - z\) 跟0的关系即可,不妨乘以一个 z 得到:

\(f(z) = -z^{2} + (n+f)z-nf = (z-n)(f-z)\)

又 \(n\leq z\leq f\) ,故 \(f(z) \geq 0\) ,即透视投影后, z 坐标相对于以前离相机更远了

对 \(f(z) = \frac{(n+f)z-nf}{z} - z\) ,对 \(z\) 求偏导

\(\begin{array}{l}
\frac{\partial f}{\partial z}=\frac{(n+f) z-(n+f) z+nf}{z^{2}}-1 \\
\frac{\partial f}{\partial z}=\frac{n f}{z^{2}}-1=\frac{nf-z^{2}}{z^{2}} \\
z^{2}=nf \quad z= \pm \sqrt{nf}
\end{array}\)

\(z\) 从 \(n\) 到 \(- \sqrt{nf}\) 单调递增之后单调递减

分数求导

\(\begin{array}{l}
g(x) \neq 0 , f(x) , g(x) \text { 均可导 } \\
{\left[\frac{f(x)}{g(x)}\right]^{\prime}=\frac{f^{\prime}(x) g(x)-g^{\prime}(x) f(x)}{[g(x)]^{2}}}
\end{array}\)

图形学、02 推导证明 | 任意一点经过透视投影后 z 坐标相对于之前有什么变化的更多相关文章

  1. 关于delphi点击webbrowser中任意一点的问题

    关于delphi点击webbrowser中任意一点的问题 有时候我们需要delphi载入webbrowser1打开网页的时候 需要点击某一个点的位置 可能是坐标 可能是按钮 可能是其他的控件应该如何来 ...

  2. echarts 点击方法总结,点任意一点获取点击数据,在多图联动中用生成标线举例

    关于点击(包括左击,双击,右击等)echarts图形任意一点,获取相关的图形数据,尤其是多图,我想部分人遇到这个问题一直很头大.下面我用举例说明,如何在多图联动基础上,我们点击点击任意一个图上任意一点 ...

  3. echarts 点击方法总结,点任意一点获取点击数据,举例说明:在多图联动中点击绘制标线

    关于点击(包括左击,双击,右击等)echarts图形任意一点,获取相关的图形数据,尤其是多图,我想部分人遇到这个问题一直很头大.下面我用举例说明,如何在多图联动基础上,我们点击任意一个图上任意一点,在 ...

  4. Bellman_Ford算法(求一个点到任意一点的最短距离)

    单源最短路问题是固定一个起点,求它到任意一点最短路的问题. 记从起点出发到顶点 i 的最短距离为d[i],则有以下等式成立 d[i]=min{d[j]+(从j到 i 的边的权值) 看代码 #inclu ...

  5. 求树上任意一点所能到达的最远距离 - 树上dp

    A school bought the first computer some time ago(so this computer's id is 1). During the recent year ...

  6. 新手讲树:证明任意二叉树度为零的节点n0,永远比度为2的节点n2多1个

    证明:   设度为1的节点个数为n1,因为二叉树的所有节点的度都小于等于2, 所以n=n0+n1+n2; 又因为二叉树中,除了根节点所有的节点都有一个进入节点的分支,假设B为所有的分支,那么n=B+1 ...

  7. xdoj-1319 求树上任意一点的最大距离----利用树的直径

    1 #include <bits/stdc++.h> using namespace std; ; vector < vector <int> > g(N); in ...

  8. Dijkstra算法(求一点到任意一点的最短距离)

    思路:先找出最短的一个点,也就是起点,从起点出发,找最短的边,同时标记起点为true(代表已经访问过),访问过的点就不用再访问了,依次下去,保证每一次找到的边都是最短的边 到最后没有边可以更新了就代表 ...

  9. python根据圆的参数方程求圆上任意一点的坐标

    from math import cos, sin,pi x0,y0=0,0 r=4.0 angle=-25 x1 = x0 + r * cos(angle * pi / 180) y1 = y0 + ...

  10. VC、OpenGL、ArcGIS Engine开发的二维三维结合的GIS系统

    一.前言 众所周知,二维GIS技术发展了近四十年,伴随着计算机软硬件以及关系型数据库的飞速发展,二维GIS技术已日臻完善.在对地理信息的分析功能上有着无可比拟的优势.一些宏观的地理信息,一维的地理信息 ...

随机推荐

  1. node使用jsonwebtoken生成token与验证是否过期

    场景 我们可以使用 cookie,session,token 来做鉴权. 下面我们来看一下, 如何使用 token 来做鉴权 jwt.sign 的简单介绍 npm install jsonwebtok ...

  2. ElasticSearch - 批量更新bulk死锁问题排查

    一.问题系统介绍 监听商品变更MQ消息,查询商品最新的信息,调用BulkProcessor批量更新ES集群中的商品字段信息; 由于商品数据非常多,所以将商品数据存储到ES集群上,整个ES集群共划分了2 ...

  3. 【技术积累】JavaScript中的基础语法【一】

    Math对象 JavaScript中的Math对象是一个内置的数学对象,表示对数字进行数学运算的方法和属性的集合. Math对象不是一个构造函数,所以不能使用new关键字来创建一个Math对象的实例. ...

  4. Mybatis(Map)

    Map 假设,我们的实体类,或者数据库中的表,字段或参数过多,我们应当考虑使用map 创建接口 //万能的mapper,我们不需要知道数据库里面有什么,是一个键值对的表现 //我们只需查询对应的字段 ...

  5. asp.net core之Startup

    Startup介绍 Startup是Asp.net Core的应用启动入口.在.NET5及之前一般会使用startup.cs类进行程序初始化构造.如下: public class Startup { ...

  6. wireshark 怎么过滤字符串 和 复制data中的可读文本

    设置 首先点击,[捕获]下面的小放大镜 选择 分组字节流 - 窄(UTF-8/ASCII)- 字符串 (注意,要向选择字符串) 效果 复制报文中的可读数据 右键报文,复制,...as Printabl ...

  7. vlunhub笔记(一)deathnote

    (一)查询靶机ip 通过 arp-scan -l 查询目标靶机ip,查询结果如下图红框所示. (二)信息收集 直接访问目标ip,发现无法访问,只返回网站域名. 网站返回域名,就将该域名添加进hosts ...

  8. NativeBuferring,一种零分配的数据类型[下篇]

    上文说到Unmanaged.BufferedBinary和BufferedString是NativeBuffering支持的三个基本数据类型,其实我们也可以说NativeBuffering只支持Unm ...

  9. 零基础入门——从零开始学习PHP反序列化笔记(二)

    魔术方法 魔术方法介绍 __construct() 触发时机:实例化对象之前 构造函数,在实例化一个对象的时候,首先会去自动执行的一个方法; <?php class User { public ...

  10. asp.net core之异常处理

    在开发过程中,处理错误是一个重要的方面.ASP.NET Core提供了多种方式来处理错误,以确保应用程序的稳定性和可靠性. TryCatch TryCatch是最常见也是最基础的一种异常处理方式,只需 ...