文档章节

opengl的MVP矩阵变换

流云1987
 流云1987
发布于 2017/01/21 00:35
字数 1048
阅读 538
收藏 12

假如有一个三角形,它的三个顶点是在虚拟空间中的,如果需要对这个三角形进行旋转,缩放,平移的操作,需要用到model矩阵操作,model矩阵只对当前的这个三角形操作,不会影响其他物体。在对一个物体进行矩阵操作之前,需要将这个矩阵做单位化操作。

 (1)矩阵的平移

       private final float[] modelMatrix = new float[16];  //获得一个model矩阵

       Matrix.setIdentityM(modelMatrix, 0);   //利用android自带的Matrix单位化矩阵
       Matrix.translateM(modelMatrix, 0, 0, -1.2f, 0); //将物体向Y轴移动-1.2个单位

 

(2)矩阵的旋转:当使用model矩阵旋转物体时,可以绕着X,Y,Z轴旋转,

Matrix.rotateM(modelMatrix, 0, rotateAngle, 1f, 0f, 0f);//绕着X轴旋转rotateAngle

Matrix.rotateM(modelMatrix, 0, rotateAngle, 0, 1f, 0f);//绕着Y轴旋转rotateAngle

Matrix.rotateM(modelMatrix, 0, rotateAngle, 0f, 0f, 1f);//绕着Z轴旋转rotateAngle

 

(2.1)但是如果要使得物体围绕着某一个点旋转,那该怎么办呢?答案是矩阵的复合操作。

比如一个物体有一个顶点(1.1f, -1.2f, 0),我想要这个物体围绕这个顶点旋转。

1.将物体移动到原点的位置,也就是虚拟空间的原点。Matrix.translateM(modelMatrix, 0, -1.1f, 1.2f, 0);

2.旋转该物体。Matrix.rotateM(modelMatrix, 0, rotateAngle, 1f, 0f, 0f);

3.将物体移动到(1.1f, -1.2f, 0)。Matrix.translateM(modelMatrix, 0, 1.1f, -1.2f, 0);

思路基本上这么个思路,但是这里有一个很容易掉进去的陷阱,矩阵操作的顺序。如果按照刚才的1,2,3的步骤,得不到想要的结果。因为这个和矩阵相乘有关系,放在最前面的矩阵最后被乘,最后面的矩阵最先被乘。这个数学关系有兴趣的朋友可以参考《[游戏编程数学和物理基础].(斯达乐)》这本书的6.4章节,那里讲的比较精彩。所以正确的代码顺序应该是:

        Matrix.translateM(modelMatrix, 0, 1.1f, -1.2f, 0);
        Matrix.rotateM(modelMatrix, 0, rotateAngle, 1f, 0f, 0f);
        Matrix.translateM(modelMatrix, 0, -1.1f, 1.2f, 0);

这样就使得一个物体围绕着(1.1f, -1.2f, 0)这个点,在x=1.1f这个X轴上旋转。

 

(3)接着来说说缩放,缩放是相对于虚拟空间的原点的。

 Matrix.scaleM(modelMatrix, 0, 30f, 30f, 1);

上面的代码让物体沿着X轴和Y轴放大了30倍,但是并不是沿着物体自己的中心点缩放的。

(3.1)让物体以一个指定的点作为缩放的中心点。这个其实也是矩阵的复合操作,步骤跟旋转的复合操作比较类似,可以参考上面的讲解。

 

视图矩阵:将虚拟空间中的所有的物体都做缩放,旋转,移动的操作。视图矩阵和model矩阵的不同点在于model矩阵作用于一个物体上,视图矩阵作用于空间中所有的物体上。

        private float[] viewMatrix = new float[16]; 

        Matrix.setLookAtM(viewMatrix, 0,
                0f, 0f, 1f,    //眼睛的位置
                0f, 0f, -1f,  //眼睛看的方向
                0f, 1f, 0f    //视线的法线

         ); //获得一个视图矩阵
        Matrix.translateM(viewMatrix, 0, 0, 0, -2); //将空间中所有的物体向Z轴方向平移-2个单位。

 

最后,我来讲讲透视矩阵。在2D的屏幕上面显示3D的图形效果,靠的就是这么个矩阵。使用了投影矩阵以后会产生一个视锥体,通俗点说就是远处的东西看到的更多一些,但是比较小;近处的东西看到的少一些,但是比较大。透视投影的一个最重要的任务就是计算出W的值,用这个值为后一步的透视除法做准备。

        float fov = 120;// 基于Y轴的视野
        float aspect = ((float) width / (float) height);//屏幕的宽高比
        float near = 0.1f; //近平面
        float far = 200f;  //远平面
        Matrix.perspectiveM(projectionMatrix, 0, fov, aspect, near, far);//产生透视投影矩阵

 

在透视投影之后,顶点如何变化,我会在下一篇文章中做讲解。

 

 

© 著作权归作者所有

共有 人打赏支持
流云1987
粉丝 1
博文 8
码字总数 5512
作品 0
杭州
加载中

评论(1)

爱你美wx
爱你美wx
创客矩阵
3D坐标系、矩阵变换、视景体与裁剪

背景 当前3D图形界主要有两个:微软的Direct 3D以及某组织的OpenGL。曾经一度OpenGL几乎占据所有3D图形领域,这在巨人微软面前简直就是屌丝逆袭。曾几何时微软搞IDE borland公式倒闭了,后来...

乐观的vc
2013/04/14
0
0
实验5 OpenGL变换综合练习

1.实验目的: 理解掌握OpenGL程序的投影变换,能正确使用投影变换函数,实现正投影与透视投影。 2.实验内容: (1)使用图a中的尺寸绘制小桌,三维效果图见图b。要求绘制小桌各部件时只能使...

小青_1989
2014/04/08
0
0
OpenGL开发之旅基础知识介绍

OpenGL开发之旅基础知识介绍 glLoadIdentity();gluortho2D(-1.0,1.0,-1.0,1.0) glEnd(); glPushMatrix();glPopMatrix(); 0000FF;">void) { // 清除颜色缓冲区 glClear(GLCOLORBUFFERBIT); /......

andyhe91
2013/05/11
0
0
图片和图形之应用投影和相机视图(13)

原文 概要 在OpenGL ES环境中,投影和相机视图允许您以更接近您用眼睛看物体的方式显示绘制的对象。这种物理观察的模拟是通过绘制物体坐标的数学变换完成的: 投影 - 此变换根据GLSurfaceVi...

lichong951
05/26
0
0
OpenGL实现物体动画和视频特效

OpenGL实现视频的水印、滤镜?OpenGL实现视频的剪裁、旋转? 2D/3D物体的 旋转,平移,缩放? OpenGL图片滤镜与视频滤镜? 矩阵(Matrix)是一个按照长方阵列排列的复数或实数集合,最早来自于方...

shareus
04/24
0
0

没有更多内容

加载失败,请刷新页面

加载更多

你为什么在Redis里读到了本应过期的数据

一个事故的故事 晚上睡的正香突然被电话吵醒,对面是开发焦急的声音:我们的程序在访问redis的时候读到了本应过期的key导致整个业务逻辑出了问题,需要马上解决。 看到这里你可能会想:这是不...

IT--小哥
今天
2
0
祝大家节日快乐,阖家幸福! centos GnuTLS 漏洞

yum update -y gnutls 修复了GnuTLS 漏洞。更新到最新 gnutls.x86_64 0:2.12.23-22.el6 版本

yizhichao
昨天
5
0
Scrapy 1.5.0之选择器

构造选择器 Scrapy选择器是通过文本(Text)或 TextResponse 对象构造的 Selector 类的实例。 它根据输入类型自动选择最佳的解析规则(XML vs HTML): >>> from scrapy.selector import Sele...

Eappo_Geng
昨天
4
0
Windows下Git多账号配置,同一电脑多个ssh-key的管理

Windows下Git多账号配置,同一电脑多个ssh-key的管理   这一篇文章是对上一篇文章《Git-TortoiseGit完整配置流程》的拓展,所以需要对上一篇文章有所了解,当然直接往下看也可以,其中也有...

morpheusWB
昨天
5
0
中秋快乐!!!

HiBlock
昨天
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部