计算机三维图形学中,一个基本的任务是如何描述三维空间中一个物体位置的变化,也就是如何 描述物体的运动。通常情况下,物体位置的变化包含三个基本的变化:平移、旋转和缩放,物体的运动也可以用这三个基本的运动形态的组合来描述。

图形学中物体运动的数学表述是:将点的初始位置坐标P0映射到经过平移、旋转、绽放后的新位置P1的过程。

平移:

平移就是在原始的三维空间坐标点上分别加上对应方向上的平移量:

旋转:

旋转分为两类:在二维平面和三维空间中的旋转。

二维平面上的旋转:

相对坐标注原点旋转角度θ:

以矩阵形式表述:

扩展到三维空间,先看简单的绕某一个坐标轴旋转的情况。

绕Z轴旋转:

绕X轴旋转:

绕Y轴旋转:

三维空间中绕指定的任意轴旋转变换可以分解为分别绕三个坐标轴的旋转变换和一个平移变换的叠加。

缩放变换是三个维度上分别乘一个缩放系数:

总结以上,可以看到变换后的坐标点除了平移变换是在原始坐标上加上一个平移向量外,旋转、缩放都是在原始坐标点上乘以一个变换矩阵。

为了把平移变换也统一成矩阵相乘的形式,引入了齐次坐标。齐次坐标就是将一个原来是N维的向量用一个N+1维向量来表示 。在齐次坐标中用4个分量来表示三维空间中的一个点,前三个分量跟普通三维坐标一样,第四个分量设置为1。

在齐次坐标下,平移变换可以表述为:

这样,在齐次坐标系下,三维空间的运动一一平移、旋转、缩放在形式上都统一为左乘一个变换矩阵的形式。

考察一个物体的运动,先进行一次平移,再进行一次旋转,两个运动可以表述为:

R*T也是一个4*4的变换矩阵,这个变换包含了一次平移和一次旋转的叠加。

推广到更复杂的变换,只需要在当前R*T矩阵上依次左乘上对应的变换矩阵,最终得到的变换矩阵包含了物体所有变换的叠加,而这一系列的变换只需要用初始坐标左乘上这个最终的变换矩阵就可以实现,这个矩阵就是“模型矩阵”。


例如对于三维空间中的一条直线,直线经过点(x0,y0,z0),并且方向为(a,b,c),则一个物体绕该直线旋转θ角度的运动变换可以分解为:

  • 平移(-x,-y,-z)平移到原点
  • 绕x轴旋转角度p使指定的旋转轴在x-z平面上
  • 绕y轴旋转角度q使指定的旋转轴与z轴重合
  • 绕z轴旋转角度 绕y轴旋转角度-q
  • 绕x轴旋转角度-p
  • 平移(x,y,z )

综上可以看到,模型矩阵描述了三维空间物体的一系列变换的信息。在物体为刚体模型(刚体是在运动中和受力作用后,形状和大小不变,而且内部各点的相对位置不变的物体)的情况下,物体的所有顶点通过左乘模型矩阵,就可以实现物体的指定运动,所以模型矩阵大大降低了运动模型的复杂度。

模型视图矩阵

在模型矩阵中,关心的是物体在运动之后在世界坐标系下位置坐标点的变化。更加普遍的情况是,我们更加关心物体相对于观察者的位置变化,而不仅仅是关于世界坐标系下的变化。例如观察者在一辆运动着的汽车中观察另一辆相向而行的汽车的变换,这时候观察者和被观察的物体都在运动。这种观察者也在移动的情况,在现实世界中更加普遍。这也增加了确定运动模型的复杂度。

所幸的是,我们可以从另一个角度看待这个问题,即观察者的位置和方向发生变化时(这个变换可以用一个模型矩阵来表述),可以看做是被观察的物体进行了观察者运动相反的运动,即需要在模型矩阵的基础上再左乘一个观察者变换矩阵的逆矩阵,这个逆矩阵称为“视图矩阵”,而这个视图矩阵跟模型矩阵相乘得到的矩阵就是所谓的“模型视图矩阵”。

物体左乘模型视图矩阵后获得的新的位置(形状),描述 的是当观察者和物体都在运动时,物体在观察者眼中坐标点(形状)的变化。

数学 就是这么奇妙,它先把一个很简单问题复杂化,然后再把它简单化,以彰显其牛逼之处。

OpenGL(五) 三维变换之模型视图矩阵的更多相关文章

  1. WEBGL学习【四】模型视图矩阵

    <html lang="zh-CN"> <!--服务器运行地址:http://127.0.0.1:8080/webgl/LearnNeHeWebGL/NeHeWe ...

  2. WebGL简易教程(六):第一个三维示例(使用模型视图投影变换)

    目录 1. 概述 2. 示例:绘制多个三角形 2.1. Triangle_MVPMatrix.html 2.2. Triangle_MVPMatrix.js 2.2.1. 数据加入Z值 2.2.2. ...

  3. [OpenGL ES 03]3D变换:模型,视图,投影与Viewport

    [OpenGL ES 03]3D变换:模型,视图,投影与Viewport 罗朝辉 (http://blog.csdn.net/kesalin) 本文遵循“署名-非商业用途-保持一致”创作公用协议 系列 ...

  4. SCARA——OpenGL入门学习五六(三维变换、动画)

    OpenGL入门学习(五) 此课为三维变换的内容,比较枯燥.主要是因为很多函数在单独使用时都不好描述其效果, 在前面绘制几何图形的时候,大家是否觉得我们绘图的范围太狭隘了呢?坐标只能从-1到1,还只能 ...

  5. OpenGL模型视图变换、投影变换、视口变换的理解

    OpenGL中不设置模型,投影,视口,所绘制的几何图形的坐标只能是-1到1(X轴向右,Y轴向上,Z轴垂直屏幕向外). 产生目标场景的过程类似于用照相机进行拍照: (1)把照相机固定在三角架上,并让他对 ...

  6. 简单理解OpenGL模型视图变换

    前几天学习了OpenGL的绘图原理(其实就是坐标的不停变换变换),看到网上有个比较好的例程,于是学习了下,并在自己感兴趣的部分做了注释. 首先通过glMatrixMode(GL_MODELVIEW)设 ...

  7. WEBGL学习【八】模型视图投影矩阵

    <!--探讨WEBGL中不同图形的绘制方法:[待测试2017.11.6]--> <!DOCTYPE HTML> <html lang="en"> ...

  8. OpenGL chapter4 基础变换

    math3d库有两个数据类型,能够表示一个三维或四维向量: M3DVector3f M3DVector4f 4.3 理解投影 正投影 : 正交变换 透视投影 : 透视变换 表4.1 OpenGL变换术 ...

  9. three.js中的矩阵变换(模型视图投影变换)

    目录 1. 概述 2. 基本变换 2.1. 矩阵运算 2.2. 模型变换矩阵 2.2.1. 平移矩阵 2.2.2. 旋转矩阵 2.2.2.1. 绕X轴旋转矩阵 2.2.2.2. 绕Y轴旋转矩阵 2.2 ...

随机推荐

  1. POJ 2642 The Brick Stops Here 0-1背包

    poj: http://poj.org/problem?id=2642 大意: 给出n(n<=200)块黄铜合金,还有它们的浓度和价钱.给出若干个个询问使它们在n块中取 M 块 使得这M块合金的 ...

  2. 关于Topsort

    Long time no see. 拓扑排序 英文名称:Topological-sort 别称:toposort or  topsort 拓扑排序是干什么的呢 对一个有向无环图(Directed Ac ...

  3. ORACEL上传BLOB,深度遍历文件夹

    // uploadingDlg.cpp : 实现文件// #include "stdafx.h"#include "uploading.h"#include & ...

  4. [Redis专辑][1]ubuntu12.04下安装php-redis的方法和步骤

    首次公布路径:phpredis的安装 非常久非常久没有写博文了,好多博文都没有整理完成,今天才抽时间整理完这一篇博文,希望能对大家有一定的帮助 首先对redis做个简单的介绍: Redis 是全然开源 ...

  5. php实现判断树的子结构

    php实现判断树的子结构 一.总结 很简单的递归判断 二.php实现判断树的子结构 题目描述: 输入两棵二叉树A,B,判断B是不是A的子结构.(ps:我们约定空树不是任意一个树的子结构) 三.代码 代 ...

  6. MHA 一主两从搭建-脚本VIP-自动切换

    环境介绍:主机名 IP MHA角色 MySQL角色node1 192.168.56.26 Node MySQL Master node2 192.168.56.27 Node MySQL Master ...

  7. LinearLayout的一些注意事项 分类: H1_ANDROID 2013-10-26 23:01 856人阅读 评论(0) 收藏

    1.orientation的默认值为horizontal,即从左向右排列.由于一般从上向下排列,所以必须指定orientation属性. 2.layout_gravity与gravity的区别: (1 ...

  8. input常用输入框限制

    input常用输入框限制 本篇 1.小写自动转换成大写:  or 2.大写自动转换成小写  or 3.防止退后清空的TEXT文档 4.ENTER键可以让光标移到下一个输入框 5.只能为中文(有闪动) ...

  9. 【t035】收入计划

    Time Limit: 1 second Memory Limit: 32 MB [问题描述] 高考结束后,同学们大都找到了一份临时工作,渴望挣得一些零用钱.从今天起,Matrix67将连续工作N天( ...

  10. linux下如何查找nginx配置文件的位置

    nginx的配置放在nginx.conf文件中,一般我们可以使用以下命令查看服务器中存在的nginx.conf文件. locate nginx.conf /usr/local/etc/nginx/ng ...