计算机图形学入门04:视图变换

1.MVP变换

将虚拟场景中的模型投影到屏幕上,也就是二维平面上,需要分三个变换。

1.首先需要知道模型的位置,也就是前面提到的基本变换,像缩放、平移,旋转,也称为模型(Model)变换

2.然后需要知道从哪里看,需要调整相机的位置和方向,也就是视图(View)变换 ,也称为相机**(Camera)变换**。

3.最后需要将三维图形投影到二维平面上,就是投影(Projection)变换

上述三个总称为MVP变换。MVP变换与拍照可以直观类比如下:

摆Pose-模型变换

调整相机-视图变换

拍照-投影变换

2.视图变换

上述已经说明了什么是视图变换。

2.1如何执行视图变换

视图变换也就是相机变换,需要先确定一个相机。确定相机需要三个因素:

1.位置,指相机摆放的位置,记作e

2.视线方向,指相机往哪看,记作g

3.上方向,用来保证相机无法绕z轴旋转,记作t

2.2观察的关键

如果物体与相机一起移动,得到的"照片"将是相同的。也就是说相机和所有东西都一起移动的时候,得到的结果是一样的。所以得出一个结论,就是可以永远将相机固定在一个位置上,所有移动都是其他物体在移动,并且相机放在原点,相机方向是-Z方向,上方向是Y轴。 这样称为相机的标准位置。如图:

这样设置相机是为了简化操作。

2.3视图变换矩阵推导

将任意位置的相机变换到上面说的标准位置上,如图所示:

可分成以下三步步:

1.从 e位置平移到坐标原点

2.视线方向从g 旋转到**-Z**

3.上方向从t 旋转到Y ,这时g × t 也自动与X重合了

将上述操作如何用矩阵表示,首先确定相机先平移再旋转,前面讲过矩阵是从右向走应用的,所以先写出如下:

1.相机从 e位置平移到坐标原点的平移矩阵如下:

2.视线方向 g 旋转到**-Z** ,上方向 t 旋转到Yg × t 旋转到X 。这样不好写,因为把任意个轴旋转到规范化的轴,比如**-Z(0,0,-1)。** 同理 t 旋转到Y 也不好写**。** 但是反过来好写,把X(1,0,0) 旋转到g × tY(0,1,0) 旋转到 tZ(0,0,1) 旋转到**-g** ,这就是之前学过的逆变换 ,也就是逆矩阵。视图旋转矩阵的逆矩阵如下:

前面讲过旋转矩阵是正交矩阵 ,所以旋转矩阵的逆矩阵就是它的转置矩阵,那么只要把逆矩阵转置即可得到想要的视图旋转矩阵:

将平移矩阵与旋转矩阵带入可得视图变换矩阵

相关推荐
John_ToDebug1 天前
深度解析:SVG、VectorIcon 和 位图图像的区别与优劣势
chrome·windows·图形渲染
xixixi777771 天前
从“视觉感知”到“逻辑结构”的转化,是计算机从“看到像素”到“理解含义”的认知飞跃
图像处理·图形渲染·逻辑结构·视觉感知
明洞日记2 天前
【VTK手册019】 深入理解 vtkProperty:从几何表达到 PBR 物理渲染
c++·图像处理·算法·vtk·图形渲染
明洞日记3 天前
【VTK手册017】 深入详解 vtkImageMathematics:医学图像的基本算术运算
c++·图像处理·算法·vtk·图形渲染
BoBoZz193 天前
QuadraticHexahedronDemo 非线性单元的展示与窗口交互
python·vtk·图形渲染·图形处理
郝学胜-神的一滴4 天前
Horse3D游戏引擎研发笔记(十):在QtOpenGL环境下,视图矩阵与投影矩阵(摄像机)带你正式进入三维世界
c++·3d·unity·游戏引擎·godot·图形渲染·unreal engine
BoBoZz194 天前
TessellatedBoxSource 创建并渲染一个细分的、可移动的箱体模型
python·vtk·图形渲染·图形处理
海中有金4 天前
UE4 内存池浅谈[3]——3代内存池对比总观
ue4·图形渲染
郝学胜-神的一滴5 天前
OpenGL错误检查与封装:构建健壮的图形渲染系统
开发语言·c++·程序人生·软件工程·图形渲染
DBBH6 天前
Cesium源码分析之渲染3DTile的一点思考
图形渲染·webgl·cesium.js