前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >OpenGL(五)-- OpenGL中矩阵的变换OpenGL(五)-- OpenGL中矩阵的变换

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

作者头像
用户8893176
发布2021-08-09 14:33:42
2.1K0
发布2021-08-09 14:33:42
举报
文章被收录于专栏:小黑娃Henry小黑娃Henry

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)的乘积,从而得到视图坐标系。
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2020/7/10 下,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • OpenGL(五)-- OpenGL中矩阵的变换
  • 前言
    • 坐标系
      • 物体旋转、平移变换
        • 投影方式
          • 在OpenGL中矩阵的计算方式
            • 矩阵栈
              • 仿射变换API
              • 后序
              领券
              问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档