OpenGL(五)-- OpenGL中矩阵的变换OpenGL(五)-- OpenGL中矩阵的变换

2021-08-09 14:33:42 浏览数 (1)

OpenGL(五)-- OpenGL中矩阵的变换

前言

照常提出几个问题,希望通过阅读可以找到答案。

  1. 对物体3维的2维投影进行位移,有几种方式?
  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直接完成计算。
代码语言:javascript复制
//几何变换的管道
GLGeometryTransform transformPipeline;
transformPipeline.SetMatrixStacks(ModelViewMatrix(模型视图矩阵), ProjectionMatrix(投影矩阵));
//获得MVP
transformPipeline.GetModelViewProjectionMatrix()
  • 通过变换管道来完成计算,尤其是计算MVP数据时会使用这种方式,比较灵活。

如果想要了解具体矩阵是如何计算的:3D数学 矩阵知识

矩阵栈

在计算时会发现这种计算会导致物体唯一无法重置,为了解决这种问题OpenGL提出了矩阵栈的概念。栈这个概念应该是很熟悉了吧!原则:先进后出

以上图片出自:凡几多

简单阐述一下过程:

1. 压栈(PUSH操作)一个单元矩阵,初始化之后本身已近就存在一个单元矩阵。

通过Xcode来查看矩阵中的入内,需要变换为4行4列来看。

2. 拿出这单元矩阵和另一个矩阵相乘,就会得到一个新的矩阵(矩阵6)。
3. 使用矩阵6之后,将最上方矩阵出栈(POP操作)
仿射变换API

后序

将开始提出的2个问题做一个简单回答:

  1. 物体在3维空间位移,除了物体本身移动,还可以移动观察者。
  2. 模型视图矩阵代表:模型矩阵(Model Matrix)与观察者矩阵(View Matrix)的乘积,从而得到视图坐标系。

0 人点赞