读 http://www.songho.ca/opengl/gl_projectionmatrix.html

0.投影矩阵的功能:

将眼睛空间中的坐标点 [图A的视椎体]     映射到     一个(-1, 1)的空间中[图B的立方体]

图A 图B

1.我们要解的是什么问题:

我们要求一个矩阵,使得以下等式成立

[结果坐标]  = [待求矩阵] * [眼睛坐标系的坐标]

2.大致思路是什么:

我们使等式左侧的[Xc, Yc, Zc, Wc]T 坐标  和
等式右侧的[Xe, Ye, Ze, We]T 变为已知, 逆推中间的未知矩阵。

3.推导过程:

不管矩阵的其他几何含义,纯粹从等式成立的角度

3.1求矩阵第四行


a.求眼睛空间中某一点坐标在近平面的投影点坐标

从顶部y方向逆方向看向视椎体,求Xp
   ----------->>>>>>                   等式A

同理,从侧边x方向逆方向看向视椎体, 求Yp
 ----------->>>>>>   等式B


此时第三个分量Zp = -n


现在我们知道:



而进行透视除法时:



观察等式A 和等式B, 他们都除了一个 -Ze,为了好看,我们就设Wc = -Ze这样就能得到一个好看的矩阵第四行:



即 [0, 0 , -1, 0]

3.2求矩阵第一,二行

我们想要将 [l, r]线性映射到 [-1, 1] 和 [b, t]线性映射到[-1,1](l,r,b,t的含义见最上面图A)



该等式看做y = Ax + B, 即Xn = AXp + B

曲线的斜率是 (1 - (-1)) / (r - l ) = 2 / (r - l)

即Xn = Xp * 2 /(r - l) + B

代入(r, 1)这个点可求得Xn

详细计算过程为:


同理,Yn的计算过程如下:




现在我们把Yp,Xp 用 Ye,Xe代替,则有




观察上式他们都被-Ze = Wc 相除了, 于是我们的矩阵第一行,第二行变为





3.3求矩阵第三行


我们知道Z与x,y没关系,参考上面的X,Y都除以了-Ze,这里我们也这样
于是:



在眼睛空间中, We是1,等式变成;





-n 对应 -1, -f 对应 1



求出A和B
   

 

现在Zn变成了:






终于我们求得最终的矩阵为:





如果视锥体退步成一个上下对称,左右对称的视锥体,即:

那么,投影矩阵就变为我们天天见到的投影矩阵:

关于Opengl投影矩阵的更多相关文章

  1. OpenGL投影矩阵【转】

    OpenGL投影矩阵 概述 透视投影 正交投影 概述 计算机显示器是一个2D平面.OpenGL渲染的3D场景必须以2D图像方式投影到计算机屏幕上.GL_PROJECTION矩阵用于该投影变换.首先,它 ...

  2. OpenGL投影矩阵

    概述 透视投影 正交投影 概述 计算机显示器是一个2D平面.OpenGL渲染的3D场景必须以2D图像方式投影到计算机屏幕上.GL_PROJECTION矩阵用于该投影变换.首先,它将所有定点数据从观察坐 ...

  3. 【脚下生根】之深度探索安卓OpenGL投影矩阵

    世界变化真快,前段时间windows开发技术热还在如火如荼,web技术就开始来势汹汹,正当web呈现欣欣向荣之际,安卓小机器人,咬过一口的苹果,winPhone开发平台又如闪电般划破了混沌的web世界 ...

  4. OpenGL投影矩阵(Projection Matrix)构造方法

    (翻译,图片也来自原文) 一.概述 绝大部分计算机的显示器是二维的(a 2D surface).在OpenGL中一个3D场景需要被投影到屏幕上成为一个2D图像(image).这称为投影变换(参见这或这 ...

  5. DX与OpenGL投影矩阵的区别

    之前学习DX和OpenGL时到是知道一点,但是没仔细研究过,只是跟着教程抄个公式就过了,看双API引擎时发现转换时是个问题,必须搞懂,gamedev上找了个解释,希望用得上. https://www. ...

  6. OpenGL中两种计算投影矩阵的函数

    OpenGL无意间同时看到两种创建投影矩阵的写法,可以说它们完成的是同样的功能,但写法完全不同,可以观摩一下什么叫做异曲同工之妙... 第一种: gltMakeShadowMatrix函数是重点 // ...

  7. Android OpenGL ES(六)----进入三维在代码中创建投影矩阵和旋转矩阵

    我们如今准备好在代码中加入透视投影了. Android的Matrix类为它准备了两个方法------frustumM()和perspectiveM(). 不幸的是.frustumM()的个缺陷,它会影 ...

  8. [OpenGL](翻译+补充)投影矩阵的推导

    1.简介 基本是翻译和补充 http://www.songho.ca/opengl/gl_projectionmatrix.html 计算机显示器是一个2D的平面,一个3D的场景要被OpenGL渲染必 ...

  9. OpenGL中投影矩阵的推导

    本文主要是对红宝书(第八版)第五章中给出的透视投影矩阵和正交投影矩阵做一个简单推导.投影矩阵的目的是:原始点P(x,y,z)对应后投影点P'(x',y',z')满足x',y',z'∈[-1,1]. 一 ...

随机推荐

  1. idea本地调试spark,hive,kafka

    https://note.youdao.com/share/?id=753c443aa4a665679d8d00c9c50363b0&type=note#/

  2. 自动化测试系列:将常用的Android adb shell 命令行封装为C#静态函数

    更多原创测试技术文章同步更新到微信公众号 :三国测,敬请扫码关注个人的微信号,感谢! 简介:adb命令是常用的Android命令行,自动化.代码调试.手工排查问题都会用的到,这里将常用的一些命令行封装 ...

  3. 前端基础面试题(JS部分)

    1.几种基本数据类型?复杂数据类型?值类型和引用数据类型?堆栈数据结构? 基本数据类型:Undefined.Null.Boolean.Number.String 值类型:数值.布尔值.null.und ...

  4. C语言--第4次作业

    1.本章学习总结 1.1思维导图 1.2本章学习体会及代码量学习体会 1.2.1学习体会 初识数组:这几周第一次接触数组,感觉有点懵,是一个很陌生的知识点,但是运用范围及其广泛,大大简化了程序,增大了 ...

  5. UVA10163 Storage Keepers (动态规划)

    $dp[i][j]$表示前$i$个仓库由前$j$个人来守卫能取得的最大安全值: $cost[i][j]$表示前$i$个仓库由前$j$个人来守护在能取得的最大安全值的情况下的最小花费. AC代码 //# ...

  6. vtime.hpp

    //vov #ifndef VTIME_HPP #define VTIME_HPP #include <cstdio> #include <ctime> #include &l ...

  7. git与github工具使用

    这篇文章主要的目标是用较少的时间学习Git和GitHub的基本使用.在足够一般使用的前提下,尽量减少命令.如果需要其他命令,到时候再去其他地方了解就行了. 总概:所有命令前都要加 git,如下的ini ...

  8. Activity的介绍

    Activity类是Android应用程序的重要组成部分,activity的启动和组合方式是平台应用程序模型的基本组成部分.Android系统通过调用与其生命周期的特定阶段相对应的特定回调方法来启动A ...

  9. nginx 和 tp兼容pathinfo和rewrite两种url访问方式

    环境:centos7,yum安装的nginx1.10.php-fpm,tp3.2 本方法只需要配置nginx.conf的一个文件就可以支持pathinfo和rewrite两种url访问方式 vim / ...

  10. Robin Hood CodeForces - 672D (二分)

    大意: 给定数组$a$, 每次操作使最大元素减小1最小元素增大1, 求k次操作后最大值与最小值的差. 二分出k次操作后最大值的最小值以及最小值的最大值, 若和能平分答案即为$max(0,R-L)$, ...