当前位置: 首页 > news >正文

视图矩阵的推导(1)

参考网址:http://blog.csdn.net/popy007/article/details/5120158

视图矩阵处于MVP矩阵的中v。一个模型的坐标经过了V之后,就得到了世界坐标。而得到世界坐标之后,再经过V矩阵的变换就得到摄像机(视觉/眼睛)空间中的坐标。再经过P矩阵变换得到,裁剪空间中的坐标。这里讲解一下V矩阵的推导。

1、最常见的基
3D空间中最常见的基为:
v1=(1,0,0)
v2=(0,1,0)
v3=(0,0,1)
比如向量(1,2,3)在这个基下的坐标就是(1,2,3)。
这里写图片描述

2、设另外一个正交基
v1=(0,1,0)
v2=(1,0,0)
v3=(0,0,1)
那么向量(1,2,3)在此基上的坐标为多少呢?
这里写图片描述
此时可以看到向量(1,2,3)在新的基下的坐标为(2,1,3)。
3、摄像机的空间
这里写图片描述
如上图所示,我们有两个坐标系,一个世界空间的坐标系;另外一个是摄像机空间的坐标系。我们的目的是得到红色点(已知它的世界坐标为(x,y,z),在摄像机空间的的坐标(x’,y’,z’)。
利用上面基的知识,我们可以有下面的等式。
v=R.V’=Q.V”
v就是红色点。
R是世界坐标系的基
V’是v在基R下的坐标
Q为摄像机坐标系的基
V”是v在基Q下的坐标
ok,现在已知的有哪些呢?R、V’以及Q,它们分别是对应了什么呢?R是世界坐标系的基,一般为:
这里写图片描述
V’是经过模型变换得到的点的世界坐标。
Q呢?Q是摄像机的坐标空间,这个后面会介绍如何得到摄像机的坐标空间。
现在我们有了R.V’=Q.V”,只有一个未知变量,V”,如何求得V”呢?我们知道基是可逆的,所以等式两边左乘Q的逆矩阵就得到如下的等式:
Q^-1.R.V’=V”
再次化简,求由于Q是正交基,所以他的逆矩阵等于转置矩阵。
Q^t.R.V’=V”
ok,现在的重点落在了如何得到Q矩阵。
4、求摄像机的坐标系。
摄像机有位置、以及朝向的概念。所以我们首先确定摄像机的位置,然后定义一个注视的点。我们将摄像机的位置定义为p点,而注视方向,我们可以用另外一个点q表示,那么q-p就得到了指向了q点向量,那么这个方向就是摄像机的朝向了。
这里写图片描述
我们看图知道,q-p,得到的是一个向量,这个向量正式摄像机的正朝向,我们定义为z’。另外的x’和y’如何得到呢?我们利用叉乘的概念求得。首先,我们先假设摄像机的上方向和世界坐标系的上方向是相同的,你可以理解为就是(0,1,0)。那么此时我们有了两个向量,z’以及y,那么用y向量叉乘z’向量,我们得到了右向量,上图中我们用右手,将手摊开,用手掌从y向量旋转指向z’向量,我们会发现,得到的右向量(图中-x’相反),对的你没有错,就是这样。
到这里你会发现有点不对劲了,为什么我的摄像机的+x’和世界的+x是反向的呢?这也不符合尝试呀,限时世界中,我们站在地上,我们的前方就是+z,我们的右手就是+x,我们的头上即+y,那么现在假设我们的前方有个摄像机,而摄像机的朝向是朝前,当然自拍也是可以的。但常识告诉我们我们的摄像机保持的是和我们的视觉方向一致的。所以此时唯一能够修改的是我们q-p,变为p-q,即是,用摄像机的位置减去注视的点,此时得到的正好是相反的向量,这个向量我们记作是-z’,我们用y向量叉乘-z’,得到了+x方向如下图所示:
这里写图片描述
这里有参考可依的:https://learnopengl.com/#!Getting-started/Camera
其中有句话:
The name direction vector is not the best chosen name, since it is actually pointing in the reverse direction of what it is targeting.
这句话的意思是:朝向向量这个名字不太恰当,原因是次向量事实上是指向了目标点的反方向。
不管怎么说,我们用y叉乘-z’得到了+x’。即得到摄像机的右向量。
那么此时有人会说,我们有了+x’,+z’,y不就得到了摄像机的坐标系空间了吗?答案不是,因为此时我们并不能保证y和+z’是垂直的,记得坐标空间是正交的基,所以要保证三个向量是两两垂直的。下面就要得到真正的+y’了。
因为我们此时有+x’,+z’,那么用这个两个向量继续叉乘不就得到了垂直x’z’平面的向量了吗?所以用+x’叉乘+z’就得到真正的+y’了,至于为啥不+z’叉乘+x’,你用右手比划一下就知道了,如果这么做,+y’就朝下了。所以经过上面的操作之后,我们就得到摄像机的坐标空间了,即+x’,+y’,+z’。
有了这些之后,我们的等式:
Q^t.R.V’=V”
中的位置参数都知道了,Q就是这个摄像机的基;R就是世界坐标系的基;V’就是原始向量在世界坐标系的坐标;V”就可以计算出来了。

5、视图矩阵具体如何得到?
上面的推导过程,最后得到了一个摄像机的坐标系(也就是基础坐标系),也叫向量空间。那么这个和我们的世界坐标空间有什么不同吗?你真的知道有什么不同吗?它没有位置信息,只有一个旋转信息,因为所有的基空间的向量都是没有位置信息的。只不过是如下图所示:
这里写图片描述
也就是说摄像机的空间只是世界坐标系旋转了一定的角度,无论是绕x、y还是z,得到的一个空间坐标系。同时将这个旋转的坐标系平移一个位置,最终就是我们的摄像机的位置以及坐标空间了。那么我们对物体进行反向的操作,即物体首先逆平移一个位置,然后在倒着旋转就得到了物体在摄像机下的空间坐标了。
假设摄像机的在原始位置(世界坐标的0,0,0位置)旋转之后的基为R,然后经过平移T,写成公式为C=T.R。
那么我们将模型做你变换,C^-1=(T.R)^-1=R^-1.T^-1
这里的T^-1就是将位置反向即可。
而R^-1呢,就是我们上面得到的摄像机空间,于是有了参考文中的视图矩阵公式:
这里写图片描述

相关文章:

  • 均值、平均值、数学期望
  • 视图矩阵的推导(2)
  • opengl从画三角形到画一个立方体(一)
  • SphereCast和SphereCastAll
  • Java中String和byte[]间的转换浅析
  • opengl从画三角形到画一个立方体(二)
  • C语言列出真分数序列代码及解析
  • opengl从画三角形到画一个立方体(三)
  • es
  • opengl从画三角形到画一个立方体(四)
  • opengl从画三角形到画一个立方体(五)
  • ZYNQ. GPIO
  • bzoj 3027 [Ceoi2004]Sweet——生成函数
  • 将光源信息应用到立方体(一)
  • unity包内的内容读取
  • 《Javascript数据结构和算法》笔记-「字典和散列表」
  • 2018天猫双11|这就是阿里云!不止有新技术,更有温暖的社会力量
  • ECMAScript6(0):ES6简明参考手册
  • Git同步原始仓库到Fork仓库中
  • react-native 安卓真机环境搭建
  • use Google search engine
  • 开年巨制!千人千面回放技术让你“看到”Flutter用户侧问题
  • 盘点那些不知名却常用的 Git 操作
  • 使用阿里云发布分布式网站,开发时候应该注意什么?
  • 一起来学SpringBoot | 第十篇:使用Spring Cache集成Redis
  • 正则表达式小结
  • elasticsearch-head插件安装
  • #gStore-weekly | gStore最新版本1.0之三角形计数函数的使用
  • #NOIP 2014#day.2 T1 无限网络发射器选址
  • (1)Nginx简介和安装教程
  • (8)STL算法之替换
  • (二十三)Flask之高频面试点
  • (亲测有效)解决windows11无法使用1500000波特率的问题
  • (三十五)大数据实战——Superset可视化平台搭建
  • (十三)Java springcloud B2B2C o2o多用户商城 springcloud架构 - SSO单点登录之OAuth2.0 根据token获取用户信息(4)...
  • (转)PlayerPrefs在Windows下存到哪里去了?
  • * 论文笔记 【Wide Deep Learning for Recommender Systems】
  • ./configure,make,make install的作用(转)
  • .NET Micro Framework初体验(二)
  • .NET 使用配置文件
  • .NET/C# 判断某个类是否是泛型类型或泛型接口的子类型
  • .NET分布式缓存Memcached从入门到实战
  • .net开发引用程序集提示没有强名称的解决办法
  • .net开源工作流引擎ccflow表单数据返回值Pop分组模式和表格模式对比
  • .NET命令行(CLI)常用命令
  • .sh
  • [.net] 如何在mail的加入正文显示图片
  • [ai笔记4] 将AI工具场景化,应用于生活和工作
  • [C++进阶篇]STL中vector的使用
  • [DevOps云实践] 彻底删除AWS云资源
  • [Docker]十.Docker Swarm讲解
  • [Electron]ipcMain.on和ipcMain.handle的区别
  • [LeetCode] 19. 删除链表的倒数第 N 个结点
  • [leetcode] Balanced Binary Tree
  • [NLP] LlaMa2模型运行在Mac机器