文档章节

opengl的MVP矩阵变换

流云1987
 流云1987
发布于 2017/01/21 00:35
字数 1048
阅读 573
收藏 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
创客矩阵
Android图形---OpenGL(三)

绘图对象的坐标映射 在Android设备上显示图形中的基本问题之一就是它们的屏幕可能是各种尺寸和形状的。OpenGL会假设一个方形区域,统一的坐标区域,并且在默认情况下,在一些方形的屏幕能够像...

长平狐
2012/10/16
108
0
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

没有更多内容

加载失败,请刷新页面

加载更多

撬动世界的支点——《引爆点》读书笔记2900字优秀范文

撬动世界的支点——《引爆点》读书笔记2900字优秀范文: 作者:挽弓如月。因为加入火种协会的读书活动,最近我连续阅读了两本论述流行的大作,格拉德威尔的《引爆点》和乔纳伯杰的《疯传》。...

原创小博客
15分钟前
0
0
《配电网自动化技术》第一章

写了配电网的组成、历程、难点、存在问题、解决方案,还是蛮好的。尤其是各地建设的系统后续又无法实用化,以及多种终端反而增加了运维工作量等,都是目前切实存在的让大家不停吐槽的内容。

max佩恩
20分钟前
0
0

中国龙-扬科
38分钟前
2
0
使用vuex的state状态对象的5种方式

vuex是一个专门为vue.js设计的状态管理模式,并且也可以使用devtools进行调试。 下面给大家来贴一下我的vuex的结构 下面是store文件夹下的state.js和index.js内容 //state.jsconst state =...

peakedness丶
42分钟前
2
0
NetCore MVC Demo

地址:http://114.116.9.72:5411

whltian
49分钟前
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部