OpenGL(五)-- OpenGL中矩阵的变换
前言
照常提出几个问题,希望通过阅读可以找到答案。
- 对物体3维的2维投影进行位移,有几种方式?
- 模型视图矩阵代表了什么?
坐标系
前提:所说的坐标系都是基于3维空间的3维坐标.
1. 局部坐标系
图中LOCAL SPACE又称为本地坐标系。描述物体本身的顶点坐标。
2. 世界坐标系
- WORLD SPACE称为世界坐标系,记录物体在坐标系中的位置;
- 世界坐标系是由原点经过
模型矩阵(Model Matrix)
通过矩阵相乘变换得来的。
3. 视图坐标系
- 在世界坐标系中观察者的位置不同,观察到的物体也会不同。目前物体还是处于3维坐标系中。
- 视图坐标系是有世界坐标系经过
观察者矩阵(View Matrix)
通过矩阵相乘变换得来的。
4. 投影坐标系统
- 3维图像最终显示是需要转换位2维图像才可以显示,及时的3d电影也是经过处理后的2维图像。可以想象在观察者和物体中间有一个画板,观察者最终看到的图像是在这个画板上的,这个画板的位置就是由
投影矩阵
来表示的。在这个画板上的图像才是可以用于显示的2d图像。 - 通过对视图坐标系经过
投影矩阵(Projection Matrix)
通过矩阵相乘变换得来的。
通过模型矩阵
,观察者矩阵(View Matrix)
,投影矩阵(Projection Matrix)
三步矩阵变换后最终确定该展示怎样的图像。要注意的是矩阵的计算时从右往左的所以:
result = 投影矩阵
* 观察者矩阵
* 模型矩阵
。
物体旋转、平移变换
- 具体可以想象移动的是物体的每一个点,在旋转之后物体的每一个点都的方向向量都会旋转,之后平移就会按照方向向量来进行移动
- 先平移不会修改物体额方向向量,所以旋转就会得到不同的效果。
投影方式
上面提到了投影矩阵,其实投影矩阵分为:正投影
,透视投影
,下面就投影方式做一个解释.
1. 正投影
- 正射投影(Orthographic Projection):矩阵定义了一个类似立方体的平截头体,指定了一个裁剪空间,每一个在这空间外面的顶点都会被裁剪。从而得到一个2d图像。
2. 透视投影
20181104204535641.png
- 透视投影(Perspective Projection):它是从某个投射中心将物体从后往前投射到单一投影面(视口)上所得到的图形。透视图与人们观看物体时所产生的视觉效果非常接近。
- 之前有提到过类似“画板”其实也是
视口
。 - 确立透视投影需要的参数: aspect(远/近裁切面的宽高比,它本身也是视口) , near(近裁切面位置) , far(远裁切面位置),投影角度,视口位置
以上图片都出自:_superhuihui-OpenGL中涉及到的矩阵变换
在OpenGL中矩阵的计算方式
代码语言:javascript复制// 矩阵计算
m3dMatrixMultiply44(ModelViewMatrix(模型视图矩阵),ViewMatrix(观察者矩阵), ModelMatrix(模型矩阵));
- 上述方式是通过API直接完成计算。
//几何变换的管道
GLGeometryTransform transformPipeline;
transformPipeline.SetMatrixStacks(ModelViewMatrix(模型视图矩阵), ProjectionMatrix(投影矩阵));
//获得MVP
transformPipeline.GetModelViewProjectionMatrix()
- 通过变换管道来完成计算,尤其是计算
MVP
数据时会使用这种方式,比较灵活。
如果想要了解具体矩阵是如何计算的:3D数学 矩阵知识
矩阵栈
在计算时会发现这种计算会导致物体唯一无法重置,为了解决这种问题OpenGL提出了矩阵栈
的概念。栈这个概念应该是很熟悉了吧!原则:先进后出
。
以上图片出自:凡几多
简单阐述一下过程:
1. 压栈(PUSH操作)
一个单元矩阵,初始化之后本身已近就存在一个单元矩阵。
通过Xcode来查看矩阵中的入内,需要变换为4行4列来看。
2. 拿出这单元矩阵和另一个矩阵相乘,就会得到一个新的矩阵(矩阵6)。
3. 使用矩阵6之后,将最上方矩阵出栈(POP操作)
仿射变换API
后序
将开始提出的2个问题做一个简单回答:
- 物体在3维空间位移,除了物体本身移动,还可以移动观察者。
- 模型视图矩阵代表:模型矩阵(Model Matrix)与观察者矩阵(View Matrix)的乘积,从而得到视图坐标系。