专栏首页小黑娃HenryOpenGL(五)-- OpenGL中矩阵的变换OpenGL(五)-- OpenGL中矩阵的变换

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

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中矩阵的计算方式

// 矩阵计算
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个问题做一个简单回答:

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

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • ​OpenGL 学习系列---坐标系统

    在前面绘制基本图形中,遇到了很明显的问题,圆形不像圆形,正多边形不像正多边形?就像下面图形一样:

    音视频开发进阶
  • OpenGL与OpenGL在移动端的应用

    OpenGL首先我们从字面意思来理解:Open Graphics Library,开放的图形库,图形库自然是处理图形的,所以简单来说OpenGL就是用来处理图形...

    清墨
  • OpenGL矩阵变换的数学推导

    说起OpenGL的矩阵变换,我是之前在我们的项目天天P图、布丁相机中开发3D效果时才比较深入地研究了其中的原理,当时一开始时,也只是知道怎么去用这些矩阵,却不知...

    腾讯Bugly
  • OpenGL ES (iOS) 学习笔记 — 基础篇(一)

    最近一直在做视频相关的工作,结合最近很火的AR技术,所以准备好好学习一下3D渲染的相关知识。因为一直在iOS移动端开发,所以学习一下OpenGL ES 技术。 ...

    MelonTeam
  • 附加实验2 OpenGL变换综合练习

    理解掌握OpenGL程序的投影变换,能正确使用投影变换函数,实现正投影与透视投影。

    步行者08
  • OpenGL渲染流水线之世界矩阵,相机变换矩阵,透视投影变换矩阵

    版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.n...

    用户1148525
  • NDK OpenGLES3.0 开发(八):坐标系统

    我们知道 OpenGL 坐标系中每个顶点的 x,y,z 坐标都应该在 -1.0 到 1.0 之间,超出这个坐标范围的顶点都将不可见。

    字节流动
  • OpenGL ---渲染流水线之世界矩阵,相机变换矩阵,透视投影变换矩阵

    https://blog.csdn.net/qq_29523119/article/details/78577246

    用户1148525
  • OpenGL ES 2.0 (iOS)[02]:修复三角形的显示

    从图可以看出,这三个数据形成的其实是一个等边直角三角形,而在 iOS 模拟器中通过 OpenGL ES 绘制出来的是直角三角形,所以是有问题的,三角形被拉伸了。

    半纸渊
  • OpenGL中投影变换矩阵的反向推导

    wxdut.com
  • OpenGLES讲解稿

    今天我们讲一下OpenGL与OpenGL在移动端的应用 OpenGL,Open Graphics Library,开放式图形库,就是一个库,与我们平时使用的三...

    清墨
  • [ - OpenGLES3.0 - ] 第一集 主线 - 打开新世界的大门

    张风捷特烈
  • OpenGL API 简介

    开发基于 OpenGL 的应用程序,必须先了解 OpenGL 的库函数。它采用 C 语言风格,提供大量的函数来进行图形的处理和显示。OpenGL 库函数的命名方...

    用户2930595
  • 实验5 OpenGL二维几何变换

    (1)阅读实验原理,掌握OpenGL程序平移、旋转、缩放变换的方法。 (2)根据示范代码,完成实验作业。

    步行者08
  • 「音视频直播技术」OpenGL渲染之距阵变换

    在Android下进行视频渲染使用的是 OpenGLES。OpenGLES(OpenGL for Embedded Systems)就是用在嵌入式系统中的 Op...

    音视频_李超
  • OPengl、DirectX、OPenCV、OpenCL

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 ...

    sofu456
  • 实验6 OpenGL模型视图变换

      (1)阅读教材有关三维图形变换原理,运行示范实验代码,掌握OPENGL程序三维图形变换的方法;   (2)阅读实验原理,运行示范实验代码,理解掌握Open...

    步行者08
  • Android开发笔记(一百五十四)OpenGL的画笔工具GL10

    上一篇文章介绍了OpenGL绘制三维图形的流程,其实没有传说中的那么玄乎,只要放平常心把它当作一个普通控件就好了,接下来继续介...

    用户4464237
  • Android OpenGL ES开发初探

    网上介绍很多,这里不多讲,直接简单的讲,OpenGL是一个可以用来画二维或者三维图形库。而OpenGL ES呢,是OpenGL针对嵌入式设备搞的一个库,所以移动...

    Clayman Twinkle

扫码关注云+社区

领取腾讯云代金券