# 详解MVP矩阵之ViewMatrix

### 矩阵推导

ViewMatrix用于直接将World坐标系下的坐标转换到Camera坐标系下。已知相机的坐标系，还有相机在世界空间下的坐标.就可以求出ViewMatrix，下面进行具体推导。

C = TR

R^(-1)比较难求出，这里用到了正交基一些知识，可以参考下碰撞检测之Ray-Cylinder检测前面关于正交基的部分。

### Look At Camera

```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);```

```//Unity
transform.position = new Vector3(1, 2, 3);
transform.LookAt(new Vector3(0, 10, 0), Vector3.up);
Debug.Log(Camera.main.worldToCameraMatrix);```

（貌似Unity中的Transform.LookAt函数是直接修改的Camera的Rotation？）

### FPS Camera

```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));```

```//unity
transform.position = new Vector3(1, 2, 3);
transform.rotation = Quaternion.Euler(30, 45, 60);
Debug.Log(Camera.main.worldToCameraMatrix);```

### 参考

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

## android矩阵详解

Matrix,中文里叫矩阵,高等数学里有介绍,在图像处理方面,主要是用于平面的缩放.平移.旋转等操作. 在Android里面,Matrix由9个float值构成,是一个3*3的矩阵.最好记住.如下图: 解释一下,上面的sinX和cosX,表示旋转角度的cos值和sin值,注意,旋转角度是按顺时针方向计算的. translateX和translateY表示x和y的平移量.scale是缩放的比例,1是不变,2是表示缩放1/2,这样子. 在android.graphics.Matrix中有对应旋转的函

## MVP 详解

Android MVP 详解(上) Android MVP 详解(下) 附: Google 官方MVP Demo

## cublas 矩阵相乘API详解

#include "cuda_runtime.h"#include "device_launch_parameters.h" #include <stdio.h>#include <stdlib.h>#include "cublas_v2.h" void multiCPU(float *c, float *a, float *b, unsigned int aH, unsigned int aW, unsigned int

## OpenCv学习笔记(四)--Mat基本图像容器Mat对象信息头,矩阵体的创建,深复制,浅复制详解

1--我们知道Mat是一个图像容器类,这个数据结构由两部分组成: 1--矩阵头--即class Mat类所实例化的类对象所开辟的空间里面存储的数据---就是这个矩阵的信息,当我们以 Mat object;这样声明类对象的时候,也仅仅是创建了一个Mat的信息头,并没有创建矩阵体,也就是说,我们并 没有给将要存储的图像开辟相应的空间 2--矩阵头--包含: 1--矩阵的尺寸----比如---class Mat这个类中的----数据成员rows,cols---就可以指定图像的尺寸 2--存储方法---

## 热门前沿知识相关面试问题-MVC/MVP/MVVM架构设计模式面试问题详解

MVC: MVC的定义:M:业务逻辑处理.[业务MODEL]V:处理数据显示的部分.[如xml布局文件]C:Activity处理用户交互的问题.[也就是Activity在MVC中扮演着C的角色] MVC的特点:①.耦合性低.②.可扩展性好.③.模块职责划分明确. MVC的实例详解: 总结:①.利用MVC设计模式,使得项目有了很好的可扩展和维护性.②.controller(控制器)是一个中间桥梁的作用.③.什么时候适合使用MVC模式呢?当一个项目很小, MVP: MVVM: 原文地址:https: