【Notes_3】现代图形学入门——基础变换、MVP变换模型
基础变换(二维)
三维变化与二维变换矩阵类似
齐次坐标下的基础变换
Scale:
s_x &0 &0\\
0 & s_y & 0 \\
0&0&1
\end{pmatrix}\]
Rotation:
\cos\alpha& - \sin\alpha & 0 \\
\sin\alpha & \cos \alpha &0 \\
0&0&1
\end{pmatrix}\]
Translation:
1 & 0 & t_x \\
0 &1& t_y\\
0 &0& 1
\end{pmatrix}\]
组合变换(Compositon Transform)
矩阵变换把先变化的矩阵放到右边:矩阵运算是从右向左
四元数与旋转公式
四元数
罗德里格斯旋转公式
Rodrigue's Rotation Formula: Raotation by angle \(\alpha\) around axis \(\vec{n}\)
\begin{matrix} \underbrace{
\begin{pmatrix}
0 & -n_z & n_y \\
n_z & 0 & -n_x \\
-n_y & n_x & 0
\end{pmatrix}
} \\ N\end{matrix}\]
In the formula
I :Identity matrix
最后乘积的结果是一个3*3的矩阵
MVP变换
Model Transformation
引用博客:MVP变换
对模型进行模型变换时,需要注意坐标系是在世界坐标系原点。当绕模型中心进行变换时,首先要将模型的中心点移动到世界坐标系的原点,之后在进行模型变换,之后移回到原来的位置。
矩阵描述为:$$M=M_t^{-1} M_r M_s M_t$$
View/Camera Transformation
这个过程是将确定相机的位置:将相机的位置通过下面的过程移动到固定的点和方向。
(1) 相机的位置固定在世界坐标系的原点: \(\vec{e}\)
(2) 相机的朝向 \(-\vec{Z}\): \(\hat{g}\)
(3) 相机的向上方向\(\vec Y\): \(\hat t\)
基于上述过程,要求视图变换矩阵\(M_{view}\)分别求相机的平移矩阵\(T_{view}\)、旋转矩阵\(R_{view}\)
1 & 0 & 0 & -x_{\vec{e}} \\
0 & 1 & 0 & -y_{\vec{e}} \\
0 & 0 & 1 & -z_{\vec{e}} \\
0 & 0 & 0 & 1
\end{bmatrix}\]
求旋转矩阵时,直接求相机旋转到原点的矩阵不容易求解,但求原点到相机位置的旋转矩阵容易求。
所以先求原点到相机的旋转矩阵:Z To \(-\hat{g}\)、Y To \(\hat{t}\)、最后保证\(\vec{X}\) To \((\hat g \times \hat t)\) 朝向的方向,原因是保证符合右手坐标系。
x_{\hat{g} \times \hat{t}}&x_{t}&x_{-g}&0\\
y_{\hat{g} \times \hat{t}}&x_{t}&y_{-g}&0\\
z_{\hat{g} \times \hat{t}}&x_{t}&z_{-g}&0\\
0&0&0&1
\end{bmatrix}\]
因为\(R_{view}^{-1}\)是正交矩阵,所以逆矩阵和旋转矩阵相同。
x_{\hat{g} \times \hat{t}}&y_{\hat{g} \times \hat{t}}&z_{\hat{g} \times \hat{t}}&0\\
x_{t}&y_{t}&z_{t}&0\\
x_{-g}&y_{-g}&z_{-g}&0\\
0&0&0&1
\end{bmatrix}\]
所以
\begin{bmatrix}
x_{\hat{g} \times \hat{t}}&y_{\hat{g} \times \hat{t}}&z_{\hat{g} \times \hat{t}}&0\\
x_{t}&y_{t}&z_{t}&0\\
x_{-g}&y_{-g}&z_{-g}&0\\
0&0&0&1
\end{bmatrix}
\]
1 & 0 & 0 & -x_{\vec{e}} \\
0 & 1 & 0 & -y_{\vec{e}} \\
0 & 0 & 1 & -z_{\vec{e}} \\
0 & 0 & 0 & 1
\end{bmatrix}\]
Projection Transformation
个人理解投影变换的终极目的是让物体挤压在一个单位大小的平面(空间)内。原因先挖个坑。
Orthographic Projection
简单理解就是将物体的忽略z坐标,将模型通过Scale To [-1,-1]^2平面内。
真正的操作:
(1) 移动模型的位置到原点
(2) 缩放模型到空间[-1,1]^3中
Perspective Projection
正视投影的光线可以看成是一个立方体,如上图。透视投影的光线可以看成一个视锥,如下图。
透视变换可以分为两个步骤进行:
(1) 将视锥挤压到立方体内\(M_{persp->ortho}\)
(2) 将挤压后的视锥进行正视投影变换$M_{ortho}
挤压时的变换矩阵\(M_{persp->ortho}=\begin{bmatrix}
n&0&0&0\\
0&n&0&0\\
0&0&n+f&-nf\\
0 & 0&1&0
\end{bmatrix}\)
所以投影变换矩阵
\]
【Notes_3】现代图形学入门——基础变换、MVP变换模型的更多相关文章
- [计算机图形学]视图变换:MVP变换、视口变换
目录 一.MVP变换 1. 模型变换 1.1 缩放矩阵 1.2 旋转矩阵 1.3 平移矩阵 2. 视角变换 3. 投影变换 二.Viewport变换 一.MVP变换 MVP变换是模型变换(M).视角变 ...
- SVG 2D入门6 - 坐标与变换
坐标系统 SVG存在两套坐标系统:视窗坐标系与用户坐标系.默认情况下,用户坐标系与视窗坐标系的点是一一对应的,都为原点在视窗的左上角,x轴水平向右,y轴竖直向下:如下图所示: SVG的视窗位置一般是由 ...
- 【Notes】现代图形学入门_01
跟着闫令琪老师的课程学习,总结自己学习到的知识点 课程网址GAMES101 B站课程地址GAMES101 课程资料百度网盘[提取码:0000] 计算机图形学概述 计算机图形学是一门将模型转化到屏幕上图 ...
- 浅入kubernetes(1):Kubernetes 入门基础
目录 Kubernetes 入门基础 Introduction basic of kubernetes What Is Kubernetes? Components of Kubernetes Kub ...
- 【Notes_4】现代图形学入门——光栅化、离散化三角形、深度测试与抗锯齿
光栅化 Viewport Transform(视口变换) 将经过MVP变换后得到的单位空间模型变换到屏幕上,屏幕左边是左下角为原点. 所以视口变换的矩阵 \[M_{viewport}=\begin{p ...
- mybatis入门基础(二)----原始dao的开发和mapper代理开发
承接上一篇 mybatis入门基础(一) 看过上一篇的朋友,肯定可以看出,里面的MybatisService中存在大量的重复代码,看起来不是很清楚,但第一次那样写,是为了解mybatis的执行步骤,先 ...
- 01shell入门基础
01shell入门基础 为什么学习和使用shell编程 shell是一种脚本语言,脚本语言是相对于编译语言而言的.脚本语言不需要编译,由解释器读取程序并且执行其中的语句,而编译语言需要编译成可执行代码 ...
- Markdown入门基础
// Markdown入门基础 最近准备开始强迫自己写博文,以治疗严重的拖延症,再不治疗就“病入骨髓,司命之所属,无奈何”了啊.正所谓“工欲善其事,必先利其器”,于是乎在写博文前,博主特地研究了下博文 ...
- JavaScript入门基础
JavaScript基本语法 1.运算符 运算符就是完成操作的一系列符号,它有七类: 赋值运算符(=,+=,-=,*=,/=,%=,<<=,>>=,|=,&=).算术运 ...
随机推荐
- hdu5371 Hotaru's problem
Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others) Total Submission ...
- MySQL 索引的类型
主键索引(PRIMARY KEY) # 主键 = 唯一键索引 + 非空 + 只能设置一个字段 # 创建表的时候创建主键索引 mysql> create table test(id int not ...
- Jenkins管理员密码忘记修改操作
一.Jenkins管理员密码忘记 当jenkins忘记了管理用户的密码时,只能通过修改配置文件并重启的方式初始化设置用户名及密码,操作如下: [root@localhost jenkins]# vim ...
- JavaScript DOM操作之查找元素节点
概要: 编程接口 可通过 JavaScript 对 HTML DOM 进行访问. 所有 HTML 元素被定义为对象,而编程接口则是对象方法和对象属性. 方法是您能够执行的动作(比如添加或修改元素). ...
- 洛谷p1886滑动窗口最大最小值 双单调队列
#include <iostream> #include <cstdio> using namespace std; int n,k,a[1000007],q1[2000007 ...
- nmap进阶使用[脚本篇]
nmap 进阶使用 [ 脚本篇 ] 2017-05-18 NMAP 0x01 前言 因为今天的重点并非nmap本身使用,这次主要还是想给大家介绍一些在实战中相对比较实用的nmap脚本,所以关于 ...
- GitHub Actions in Action
GitHub Actions in Action https://lab.github.com/githubtraining/github-actions:-hello-world https://g ...
- GitHub in depth
GitHub in depth GitHub 高级玩法 / 进阶教程 https://github.com/trending/dart?since=daily https://github.com/t ...
- 如何用 js 实现一个 apply 函数
如何用 js 实现一个 apply 函数 原理 实现方式 总结 refs https://developer.mozilla.org/en-US/docs/Web/JavaScript/Referen ...
- Linux & change username & computer name & .bashrc
Linux & change username & computer name ubuntu change username and computer name https://ask ...