文档章节

opengl的MVP矩阵变换

流云1987
 流云1987
发布于 2017/01/21 00:35
字数 1048
阅读 512
收藏 12
点赞 0
评论 1

假如有一个三角形,它的三个顶点是在虚拟空间中的,如果需要对这个三角形进行旋转,缩放,平移的操作,需要用到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
图片和图形之添加Motion(14)

原文 概要 在屏幕上绘制的对象是OpenGL的一个非常基本的功能,但你可以与其他Android图形framwork类,包括做这个Canvas和 Drawable对象。OpenGL ES提供了附加功能,用于以三维或以其他独特方...

lichong951
05/26
0
0
关于GLSL的gl_FragCoord、gl_FragDepth以及深度计算

glFragCoord和glFragDepth分别是片元着色器的输入和输出变量。 glFragCoord是个vec4,四个分量分别对应x, y, z和1/w。其中,x和y是当前片元的窗口相对坐标,不过它们不是整数,小数部分恒为0...

小熊猫大暴走
2012/11/21
0
0
计算机图形与OpenGL学习六(二维观察2.OpenGL二维观察函数)

OpenGL二维观察函数 本节概念性内容较多,为便于理解与记忆,可以查看之前文章的实例中的函数操作 1. OpenGL投影模式 在选择OpenGL裁剪窗口和视口之前,必须建立合适的模式以便构建从世界坐标...

lhs322
04/17
0
0
OpenGL超级宝典笔记——操作矩阵

为了更强大的功能和灵活性,我们有时需要直接操作矩阵。在OpenGL中4x4的矩阵用包含16个浮点数值的一维数组来表示,而不是用二维的4x4的数组来表示。OpenGL之所以这么做,因为使用一维数组更高...

Mario_Q
2013/09/24
0
0
OpenGL渲染流水中的处理步骤

显示列表: 不管数据描述的是几何体还是像素,都可以被存储在显示列表中,供现在或以后使用;也可以不将数据存储在显示列表中,而是立刻对数据进行处理,这被称为直接模式.显示列表被执行时,其中存...

wwl33695
06/26
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

shell中的函数、shell中的数组、告警系统需求分析

shell中的函数 格式: 格式: function f_name() { command } 函数必须要放在最前面 示例1(用来打印参数) 示例2(用于定义加法) 示例3(用于显示IP) shell中的数组 shell中的数组1 定义数...

Zhouliang6
今天
2
0
用 Scikit-Learn 和 Pandas 学习线性回归

      对于想深入了解线性回归的童鞋,这里给出一个完整的例子,详细学完这个例子,对用scikit-learn来运行线性回归,评估模型不会有什么问题了。 1. 获取数据,定义问题     没有...

wangxuwei
今天
1
0
MAC安装MAVEN

一:下载maven压缩包(Zip或tar可选),解压压缩包 二:打开终端输入:vim ~/.bash_profile(如果找不到该文件新建一个:touch ./bash_profile) 三:输入i 四:输入maven环境变量配置 MAVEN_HO...

WALK_MAN
今天
0
0
33.iptables备份与恢复 firewalld的9个zone以及操作 service的操作

10.19 iptables规则备份和恢复 10.20 firewalld的9个zone 10.21 firewalld关于zone的操作 10.22 firewalld关于service的操作 10.19 iptables规则备份和恢复: ~1. 保存和备份iptables规则 ~2...

王鑫linux
今天
2
0
大数据教程(2.11):keeperalived+nginx高可用集群搭建教程

上一章节博主为大家介绍了目前大型互联网项目的系统架构体系,相信大家应该注意到其中很重要的一块知识nginx技术,在本节博主将为大家分享nginx的相关技术以及配置过程。 一、nginx相关概念 ...

em_aaron
今天
1
0
Apache Directory Studio连接Weblogic内置LDAP

OBIEE默认使用Weblogic内置LDAP管理用户及组。 要整理已存在的用户及组,此前办法是导出安全数据,文本编辑器打开认证文件,使用正则表达式获取用户及组的信息。 后来想到直接用Apache Dire...

wffger
今天
2
0
HFS

FS,它是一种上传文件的软件。 专为个人用户所设计的 HTTP 档案系统 - Http File Server,如果您觉得架设 FTP Server 太麻烦,那么这个软件可以提供您更方便的档案传输系统,下载后无须安装,...

garkey
今天
1
0
Java IO类库之BufferedInputStream

一、BufferedInputStream介绍 /** * A <code>BufferedInputStream</code> adds * functionality to another input stream-namely, * the ability to buffer the input and to * sup......

老韭菜
今天
0
0
STM 32 窗口看门狗

http://bbs.elecfans.com/jishu_805708_1_1.html https://blog.csdn.net/a1985831055/article/details/77404131...

whoisliang
昨天
1
0
Dubbo解析(六)-服务调用

当dubbo消费方和提供方都发布和引用完成后,第四步就是消费方调用提供方。 还是以dubbo的DemoService举例 -- 提供方<dubbo:application name="demo-provider"/><dubbo:registry address="z...

青离
昨天
2
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部