具体解释MVP矩阵之ViewMatrix
矩阵推导
ViewMatrix用于直接将World坐标系下的坐标转换到Camera坐标系下。已知相机的坐标系。还有相机在世界空间下的坐标.就能够求出ViewMatrix。以下进行具体推导。
令UVN为相机坐标系下的三个基,,对于一个相机来说,它在開始的时候和世界坐标系是重合的,用户控制相机在世界空间中移动之后,相机的状态能够用两个属性来描写叙述——朝向和位置。也就是说。有了这两个属性,一个相机模型在世界中的状态就确定了。
而这两个属性,我们用变换的理论来描写叙述,就是旋转和平移。
能够想象,对于世界中的不论什么一个相机状态,我们都能够把它看成是:相机先环绕自身基原点旋转一定的角度,然后平移到世界空间的某个地方。下图展示了这个过程
图一 . 相机的变换与逆变换
图中,红色是相机的基,而黑色是世界的基,也就是參考系。
小人是世界中的一个物体。相机在移动之前,两个基是重合的。当相机在屏幕中定位时。它首先会进行朝向的确定——旋转。然后进行位置的确定——平移。图中的Rotation和Translation两步就是相机定位时所发生的变换。能够看到相机相对于小人的运动。而当进行相机变换的时候,小人应该从世界基变换到相机的基里面。
这样,他应该进行一个相机定位的逆定位。先逆平移小人和相机。然后再逆旋转小人和相机。最后相机归位,小人随相机变到了相机空间。这是由Inverse Translation和Inverse Rotation两个步骤完毕的。这两个步骤就是相机变换。
如今我们推导这个变换。我们把关系写出来。相机本身的变换C包含两个元素
C = TR
当中T是平移变换,R是旋转变换。而相机变换是相机本身变换的逆变换
这个C^-1就是我们要求出的相机变换。
当中T^-1非常easy求出,即
R^(-1)比較难求出,这里用到了正交基一些知识,能够參考下碰撞检測之Ray-Cylinder检測前面关于正交基的部分。
当相机变换进行完Inverse Translation这一步之后,相机的原点和世界原点就重合了,也就是处理完了关于平移的变换。接下来我们要做的是逆旋转,而事实上逆旋转的目的,就是要得到眼下世界坐标中经过逆平移的小人在相机坐标系中的坐标。
由坐标转换公式
对于世界坐标中的已经经过逆平移的坐标v’,它在相机坐标系R中的坐标是v’’,而相机坐标系就是
则相机变换的完整公式就是
当中v是小人在世界空间中的坐标。v’’是小人在相机空间中的坐标。则相机变换矩阵就是
常见的求ViewMatrix的情况有三种。一种是用LookAt函数。另外一种是相似FPS游戏中通过pitch和yaw来算,另一种是相似轨迹球的算法。
最后的方法都是转化为求出相机的坐标系的基。
Look At Camera
这里參考是左手坐标系,并且在相机空间,相机的forward是Z轴的负方向。和Unity还有OpenGL一致。
图二 . 相机的左手坐标系
例如以下图,这样的求法须要知道摄像机的位置 eye。一个up向量(global),还有摄像机的观察点at
图三 . LookAt函数模型
Matrix4x4 LookAt(const Vector3& eye, const Vector3& target, const Vector3& up)
{
Vector3 z((eye - target).normalized());
Vector3 x((Vector3::Cross(z, up).normalized()));
Vector3 y(Vector3::Cross(x, z)); Matrix4x4 result; result[0] = x.x;
result[4] = x.y;
result[8] = x.z;
result[12] = -Vector3::Dot(x, eye); result[1] = y.x;
result[5] = y.y;
result[9] = y.z;
result[13] = -Vector3::Dot(y, eye); result[2] = z.x;
result[6] = z.y;
result[10] = z.z;
result[14] = -Vector3::Dot(z, eye); result[3] = result[7] = result[11] = 0.0f;
result[15] = 1.0f;
return result;
}
算例
//C++
qDebug() << Transform::LookAt(Vector3(1, 2, 3), Vector3(0, 10, 0), Vector3::up);
图四 . LookAt函数计算结果
//Unity
transform.position = new Vector3(1, 2, 3);
transform.LookAt(new Vector3(0, 10, 0), Vector3.up);
Debug.Log(Camera.main.worldToCameraMatrix);
图五 . Unity中的计算结果
(貌似Unity中的Transform.LookAt函数是直接改动的Camera的Rotation?)
FPS Camera
通过之前的结论
如果原始的坐标系为x-(1,0,0), y-(0,1,0), z(0,0,1),这个坐标系经过一个旋转矩阵Matrix旋转之后,新的坐标系就是这个旋转矩阵的转置三个列向量。
事实上这里要求的仅仅是旋转矩阵的转置。
注意相机的Z方向并非相机正对的方向,而是相机的背面。
Matrix4x4 Transform::FPSView(const Vector3& eye, Quaternion rotation)
{
Matrix4x4 rotMatrix = rotation.GetRotMatrix().transpose();
Vector3 x(rotMatrix[0], rotMatrix[4], rotMatrix[8]);
Vector3 y(rotMatrix[1], rotMatrix[5], rotMatrix[9]);
Vector3 z(-rotMatrix[2], -rotMatrix[6], -rotMatrix[10]); Matrix4x4 result; result[0] = x.x;
result[4] = x.y;
result[8] = x.z;
result[12] = -Vector3::Dot(x, eye); result[1] = y.x;
result[5] = y.y;
result[9] = y.z;
result[13] = -Vector3::Dot(y, eye); result[2] = z.x;
result[6] = z.y;
result[10] = z.z;
result[14] = -Vector3::Dot(z, eye); result[3] = result[7] = result[11] = 0.0f;
result[15] = 1.0f;
return result;
}
算例
//C++
qDebug() << Transform::FPSView(Vector3(1,2,3), Quaternion::Euler(30, 45, 60));
结果
图六 . FPV函数计算结果
//unity
transform.position = new Vector3(1, 2, 3);
transform.rotation = Quaternion.Euler(30, 45, 60);
Debug.Log(Camera.main.worldToCameraMatrix);
图七 . Unity中执行结果
參考
Understanding the View Matrix - http://www.3dgep.com/understanding-the-view-matrix/
Tutorial 3 : Matrices - http://www.opengl-tutorial.org/beginners-tutorials/tutorial-3-matrices/
OpenGL Transformation - http://www.songho.ca/opengl/gl_transform.html
推导相机变换矩阵 - http://blog.csdn.net/popy007/article/details/5120158
链接
具体解释MVP矩阵之ViewMatrix的更多相关文章
- Real-Time Rendering (2) - 变换和矩阵(Transforms and Matrics)
http://blog.csdn.net/silangquan/article/details/9970673 提要 在图形的计算中,比如旋转.缩放.平移.投影等操作,矩阵都扮演着极其重要的角色,它是 ...
- [CG从零开始] 5. 搞清 MVP 矩阵理论 + 实践
在 4 中成功绘制了三角形以后,下面我们来加载一个 fbx 文件,然后构建 MVP 变换(model-view-projection).简单介绍一下: 从我们拿到模型(主要是网格信息)文件开始,模型网 ...
- [Swift]LeetCode861. 翻转矩阵后的得分 | Score After Flipping Matrix
We have a two dimensional matrix A where each value is 0 or 1. A move consists of choosing any row o ...
- 对评分矩阵进行分解,SVD与LSI
摘自 推荐系统 https://www.cnblogs.com/lzllovesyl/p/5243370.html 一.SVD奇异值分解 1.SVD简介 SVD(singular value deco ...
- LeetCode翻转矩阵后的得分-Python3<六>
上一篇:LeetCode子域名访问计数-Python3.7<五> 题目:https://leetcode-cn.com/problems/score-after-flipping-matr ...
- Cg入门10:Vertex Shader - 几何变换 —MVP矩阵变换
Unity内建矩阵类型: M:世界矩阵 V:摄像机矩阵 P:投影矩阵 T :矩阵的转置 IT : 转置的的逆 _Object2World: 模型到世界矩阵 _World2Object:世界到模型矩阵 ...
- OpenGL 模型视图投影矩阵 仿射矩阵
矩阵基础知识 要对矩阵进行运算,必须先要了解矩阵的计算公式,这个知识的内容涉及到了线性代数. 我们知道在Cocos2dx中,有关于平移,旋转,缩放等等操作,都必须要进行矩阵的乘法. 只需要一张图就能理 ...
- LeetCode 中级 - 翻转矩阵后的得分(861)
有一个二维矩阵 A 其中每个元素的值为 0 或 1 . 移动是指选择任一行或列,并转换该行或列中的每一个值:将所有 0 都更改为 1,将所有 1 都更改为 0. 在做出任意次数的移动后,将该矩阵的每一 ...
- MVP架构模式
概念解释 MVP是Model(数据) View(界面) Presenter(表现层)的缩写,它是MVC架构的变种,强调Model和View的最大化解耦和单一职责原则 Model:负责数据的来源和封装, ...
随机推荐
- 志愿者招募 [NOI2008] [鬼畜网络流]
Description 申奥成功后,布布经过不懈努力,终于成为奥组委下属公司人力资源部门的主管.布布刚上任就遇到了一个难题:为即将启动的奥运新项目招募一批短期志愿者.经过估算,这个项目需要N 天才能完 ...
- 最全,可直接用的一些正则校验,判断邮箱,手机号码,车牌号,身份证号,网址,账号,密码,ip,去掉html格式,工商税号等。
一些正则校验,判断邮箱,手机号码,车牌号,身份证号,网址,账号,密码,ip,去掉html格式,工商税号等. // 判断邮箱 isValid = [text isValidEmail]; // 判断手机 ...
- java-----任意进制间的转换
public class Main { public static void main(String[] args) { // TODO Auto-generated method stub Sy ...
- Sargable 与 谓语下推 (predicate pushdown) 简介
关键词:SQL优化 , sargable , pushdown filter , predicate pushdown Sargable Sargable = Search ARGument ABLE ...
- JAVA自学笔记24
JAVA自学笔记24 1.能使用同步代码块就使用同步代码块,除非锁对象是this,就可以考虑使用同步方法.静态方法的锁是类的字节码对象. 2.JDK5新特性 1)接口Lock void Lock()/ ...
- hdu6024 Building Shops(区间dp)
https://cn.vjudge.net/problem/HDU-6024 分开考虑某一点种与不种,最后取二者的最小值. dp[i][1] = min(dp[i-1][0], dp[i-1][1]) ...
- java 遍历Map的4种方法
在Java中如何遍历Map对象 How to Iterate Over a Map in Java 在java中遍历Map有不少的方法.我们看一下最常用的方法及其优缺点. 既然java中的所有map都 ...
- C#实现无物理边距 可打印区域的绘图\打印 z
经常在开发实际的应用程序中,需要用到图形绘制和打印程序.如何实现完整的精确打印和绘图是需要注意许多细节地方的.最近在遇到打印问题的时候,仔细研究一阵,总结这篇博文,写得有点杂乱,看文要还请费点神. 基 ...
- 面试必备:HashMap、Hashtable、ConcurrentHashMap的原理与区别
同步首发:http://www.yuanrengu.com/index.php/2017-01-17.html 如果你去面试,面试官不问你这个问题,你来找我^_^ 下面直接来干货,先说这三个Map的区 ...
- Go语言之高级篇beego框架之layui框架应用
1.layui前端框架 参考地址:https://www.layui.com