LookAt 矩阵

OpenGL本身没有摄像机(Camera)的概念,但我们可以通过把场景中的所有物体往相反方向移动的方式来模拟出摄像机,产生一种我们在移动的感觉,而不是场景在移动。

lookat矩阵是由这些东西来定义的:摄像头位置,它看向的方向,以及向上的up方向。由于“OpenGL中我们知道摄像机指向z轴负方向”,所以给图如下:

那么我们知道实际上坐标系的方向是这样的,我们用(eye - center)就能得到z轴的方向,然后我们定义一个向上的方向

,我们可以用
- 向上的方向叉乘z得到x方向,再用
- z方向叉乘x得到y.

也可以参考这个图:

再根据之前的坐标变换知识,于是我们可以得到lookat矩阵:

  • R - 右向量,也就是相机坐标系x在世界坐标系中的表示
  • U - 上向量,也就是相机坐标系y在世界坐标系中的表示
  • D - 方向向量,也就是相机坐标系z在世界坐标系中的表示
  • P - 相机在世界坐标系中位置

我感觉也可以这样理解,Rotation、Translation其实是相机在世界坐标系中的变换:

其实我们用它来看物体也就是它这个变换的逆变换:

而相机的旋转矩阵的逆是它的转置,平移矩阵的逆也可以在就是把它移回去,这样也跟上面的lookat矩阵一样。写个代码:

void 

Viewport 矩阵

我们再来求另一个常见矩阵,我们现在有模型都在[-1,1]*[-1,1]*[-1,1]正方体中,我们想把它映射到位置[x,x+w]*[y,y+h]*[0,d]中,我们的操作是:

  • 平移:先把[-1,1]*[-1,1]*[-1,1]平移到[0,2]*[0,2]*[0,2]
  • 缩放:[0,2]*[0,2]*[0,2]缩放到[0,1]*[0,1]*[0,1]
  • 缩放:[0,1]*[0,1]*[0,1]缩放到[0,w]*[0,h]*[0,d]
  • 平移:[0,w]*[0,h]*[0,d]移动到[x,x+w]*[y,y+h]*[0,d]

就跟窗口变换十分类似,我们可以来求得这个变换的矩阵:

计算得:

这个矩阵是OpenGL中的Viewport矩阵。

Perspective 矩阵

投影有两种:

正交:

透视:

我们都知道透视法则-近大远小,就像上图,平行的铁路公路在我们的眼睛里也是会在远处相交的。

如果我们要将P点投影到 z=0 平面上的 P' 点,camera放在C点(0, 0, c),很容易可以按照比例算出 |AB|/|AC| = |OD|/|OC| 可知: x/(c-z) = x'/c,可知:

所以我们也可以得到投影矩阵:

参考:

  • 摄像机
  • 坐标系统
  • glViewport
  • Perspective projection

opengl 矩阵投影代码 shade_LookAt、Viewport、Perspective矩阵相关推荐

  1. C++两个矩阵相乘代码(内附有矩阵相乘的条件与规则,以及对代码的详细解答)

    再复制粘贴代码之前可以先了解学习一下什么是矩阵相乘,矩阵相乘的条件与规则又是什么. 点击一下链接即可进入学习:                       #矩阵相乘的学习链接 以下是两个矩阵相乘的代 ...

  2. OpenGL学习: 投影矩阵和视口变换矩阵(math-projection and viewport matrix)

    转自:https://blog.csdn.net/wangdingqiaoit/article/details/51589825 本文主要翻译并整理自 songho OpenGL Projection ...

  3. 深入理解OpenGL之投影矩阵推导

    深入理解OpenGL之投影矩阵推导 OpenGL流水线中的投影矩阵以及坐标变换 OpenGL中,投影矩阵在Vertex shader中使用,用于变换顶点.一般和Model, View矩阵结合成MVP矩 ...

  4. 主成分分析PCA算法:为什么去均值以后的高维矩阵乘以其协方差矩阵的特征向量矩阵就是“投影”?

    这是从网上看到的PCA算法的步骤: 第一步,分别求每列的平均值,然后对于所有的样例,都减去对应的均值. 第二步,求特征协方差矩阵. 第三步,求协方差的特征值-显示全部 关注者 1,218 被浏览 78 ...

  5. 机器学习--主成分分析PCA算法:为什么去均值以后的高维矩阵乘以其协方差矩阵的特征向量矩阵就是“投影”?

    原文链接:主成分分析PCA算法:为什么去均值以后的高维矩阵乘以其协方差矩阵的特征向量矩阵就是"投影"?_天下对手教会少林武僧-CSDN博客_pca投影矩阵 这是从网上看到的PCA算 ...

  6. 编程笔试(解析及代码实现):从矩阵中寻找和最大的子矩阵(首先需要将一个列表转为一个方矩阵)

    编程笔试(解析及代码实现):从矩阵中寻找和最大的子矩阵(首先需要将一个列表转为一个方矩阵) 目录 题目描述 代码实现 题目描述 从矩阵中寻找和最大的子矩阵(首先需要将一个列表转为一个方矩阵) 样例输入 ...

  7. 串联矩阵matlab代码,Matlab串联矩阵函数【horzcat】详细解析

    语法 C = horzcat(A,B) C = horzcat(A1,A2,-,An) 复制代码 输入参数 A - 第一个输入 标量 | 向量 | 矩阵 | 多维数组 | 表 | 时间表 第一个输入, ...

  8. python实现推荐系统代码_推荐系统之矩阵分解及其Python代码实现

    有如下R(5,4)的打分矩阵:("-"表示用户没有打分) 其中打分矩阵R(n,m)是n行和m列,n表示user个数,m行表示item个数 那么,如何根据目前的矩阵R(5,4)如何对 ...

  9. sklearn对三维矩阵降维代码实现

    本文由公众号<湾区人工智能>提供,如果觉得不错,请扫码关注,了解更多Python和人工智能知识 sklearn对三维矩阵降维 思路: 把三维矩阵reshape成二维,然后对二维矩阵降维,然 ...

  10. MPI矩阵向量乘法代码《并行程序设计导论》

    本文所写内容是根据<并行程序设计导论>第三章中的矩阵向量乘法代码总结而来的完整代码. 完整代码如下Mat_vect_mult.c #include<stdio.h> #incl ...

最新文章

  1. 因为失误导致数据丢失
  2. oracle sap 用友 保险财务系统比较,SAP和用友的财务管理系统比较详解
  3. MFC_Combo_Box(组合框)的详细用法
  4. 二十一、文本情感分类二
  5. 牛客题霸 [输出二叉树的右视图] C++题解/答案
  6. 第二章 Java基本语法(三)
  7. LeetCode 573. 松鼠模拟(数学)*
  8. (王道408考研数据结构)第六章图-第四节4:最短路径之迪杰斯特拉算法(思想、代码、演示、答题规范)
  9. watch解放你的双手
  10. SpringCloud学习指南【更新】
  11. 为您的Android,iOS等应用加入声波传输功能
  12. [转]installshield for VC++6 如何使用
  13. WPF面板布局介绍Grid、StackPanel、DockPanel、WrapPanel
  14. java你的线上欧美_JAVA 线上故障排查全套路
  15. 用计算机计算教学反思,计算器教学反思
  16. VS2010扩展VAX的安装使用
  17. vue实现抽奖大转盘
  18. Ruoyi若依前后端分离框架【若依登录详细过程】
  19. Base64编解码工具
  20. linux make命令error2,make命令出错,求解释。

热门文章

  1. 【LOJ】#2532. 「CQOI2018」社交网络
  2. A complete log of this run can be found in
  3. Plants vs. Zombies(二分好题+思维)
  4. UVA - 815 Flooded!
  5. 几种支持动作模型格式的比较(MD2,MD5,sea3d) 【转】
  6. 登陆系统的设计1 - 设计用户数据表
  7. 判断 wp 是否是活跃页面
  8. postgresql查看表的创建者和表的权限
  9. 648 页全彩 + 395张插图 的机器翻译传奇巨作 -- 送几本~
  10. 【图神经网络入门】GAT图注意力网络