Matrix.multiplyMM(float[] result, int resultOffset, float[] lhs, int lhsOffset, float[] rhs, int rhsOffset)
Multiply two 4x4 matrices together and store the result in a third 4x4 matrix. In matrix notation: result = lhs x rhs. Due to the way matrix multiplication works, the result matrix will have the same effect as first multiplying by the rhs matrix, then multiplying by the lhs matrix. This is the opposite of what you might expect. The same float array may be passed for result, lhs, and/or rhs. However, the result element values are undefined if the result elements overlap either the lhs or rhs elements.
将两个4x4矩阵相乘,把结果存到第三个4x4矩阵里。用矩阵符号表示:result = lhs x rhs 。由于矩阵相乘的工作方式,结果矩阵的效果相当于先被右边的矩阵乘,再被左边的矩阵乘。这跟你期望的情况是相反的。同一个float数组可以作为结果矩阵、左边矩阵、右边矩阵。然而,如果结果矩阵的元素与右边矩阵或左边矩阵的元素重叠,结果矩阵的元素就会无法确定。
奇怪的是,在Android的官方例子中看到如下的代码:
Matrix.multiplyMM(mMVPMatrix, 0, mProjMatrix, 0, mMVPMatrix, 0);
结果矩阵和右边矩阵都是mMVPMatrix,offset都是0。
做如下的测试:
float[] lhs = new float[16]; float[] rhs = new float[16]; float[] res = new float[16]; Matrix.setRotateM(lhs, 0, 45, 1, 1, 0); Matrix.setRotateM(rhs, 0, 30, 0, 1, 1); System.out.println("lhs"); MatrixUtil.printMatrix(lhs); System.out.println("rhs"); MatrixUtil.printMatrix(rhs); Matrix.multiplyMM(res, 0, lhs, 0, rhs, 0); System.out.println("res"); MatrixUtil.printMatrix(res); Matrix.setRotateM(lhs, 0, 45, 1, 1, 0); Matrix.setRotateM(rhs, 0, 30, 0, 1, 1); Matrix.multiplyMM(rhs, 0, lhs, 0, rhs, 0); System.out.println("overlap rhs res"); MatrixUtil.printMatrix(rhs); Matrix.setRotateM(lhs, 0, 45, 1, 1, 0); Matrix.setRotateM(rhs, 0, 30, 0, 1, 1); Matrix.multiplyMM(lhs, 0, lhs, 0, rhs, 0); System.out.println("overlap lhs res"); MatrixUtil.printMatrix(lhs);
运行结果:
lhs
0.8536 0.1464 0.5000 0.0000
0.1464 0.8536 -0.5000 0.0000
-0.5000 0.5000 0.7071 0.0000
0.0000 0.0000 0.0000 1.0000
rhs
0.8660 -0.3536 0.3536 0.0000
0.3536 0.9330 0.0670 0.0000
-0.3536 0.0670 0.9330 0.0000
0.0000 0.0000 0.0000 1.0000
res
0.6142 -0.1316 0.7781 0.0000
0.6054 0.7111 -0.3576 0.0000
-0.5062 0.6907 0.5165 0.0000
0.0000 0.0000 0.0000 1.0000
overlap rhs res
0.6142 -0.1316 0.7781 0.0000
0.6054 0.7111 -0.3576 0.0000
-0.5062 0.6907 0.5165 0.0000
0.0000 0.0000 0.0000 1.0000
overlap lhs res
0.6142 -0.0470 0.6805 0.0000
0.6054 0.5488 -0.2157 0.0000
-0.5062 0.6929 0.5272 0.0000
0.0000 0.0000 0.0000 1.0000
当结果矩阵与右边矩阵重叠时,运算结果是正确的。
当结果矩阵与左边矩阵重叠时,运算结果是不正确的。
这就可以理解为啥Matrix.multiplyMM(mMVPMatrix, 0, mProjMatrix, 0, mMVPMatrix, 0);工作正常了。当然为了避免出问题,最好还是不要重叠。
void android.opengl.Matrix.setRotateM(float[] rm, int rmOffset, float a, float x, float y, float z)
设置矩阵rm为绕axis (x, y, z)旋转角度a的旋转矩阵。
void android.opengl.Matrix.rotateM(float[] m, int mOffset, float a, float x, float y, float z)
Rotates matrix m in place by angle a (in degrees) around the axis (x, y, z)
让矩阵m右乘一个旋转矩阵。
作用到一个物体上时,效果是让物体先旋转,再被m作用。
void android.opengl.Matrix.translateM(float[] m, int mOffset, float x, float y, float z)
Translates matrix m by x, y, and z in place.
让矩阵m右乘一个平移矩阵。
作用到一个物体时,效果是让物体先平移,再被m作用。
相关推荐
在这个"Android下 OpenGL ES 2.0 混合半透明效果demo"中,我们将探讨如何在Android应用中实现半透明效果的混合。 首先,理解OpenGL ES 2.0的核心概念至关重要。它基于着色器模型,这意味着开发者可以编写顶点着色器...
使用`glRotatef()`函数(或者在现代OpenGL中使用矩阵操作)来指定旋转的角度和轴。 3D旋转涉及到向量和矩阵操作。在OpenGL中,旋转可以通过乘以一个旋转矩阵来实现。例如,你可以使用`glRotatef(rotateAngle, x, y,...
通过阅读和理解这些代码,你可以更好地掌握Android环境下使用OpenGL ES进行3D图形编程的技巧。 总之,创建透明的三维坐标系涉及理解OpenGL ES的坐标系统、颜色混合、深度测试、几何变换以及着色器的使用。这个过程...
对于骰子的旋转效果,可以使用OpenGL的矩阵操作来实现。在每次绘制之前,都会更新一个旋转矩阵,这个矩阵可以控制物体的旋转角度和轴。通常,你会使用`glRotatef`函数来指定围绕X、Y或Z轴的旋转角度。为了实现平滑的...
通过矩阵变换,可以实现旋转、缩放和平移等操作。 4. **颜色模型和纹理贴图**:OpenGL支持多种颜色模型,如RGB、RGBA等。纹理贴图则是将图像应用于模型表面的技术,增强了图形的真实感。 #### OpenGL ES在Android...
- **适应Activity生命周期**:确保OpenGL ES资源在Activity的不同状态(如暂停、恢复)下正确处理。 - **Framebuffer像素格式选择**:简化配置过程,确保图像质量与性能平衡。 - **绘图线程管理**:独立的绘图线程可...
在Android中,我们通常使用Android的OpenGL ES API,通过Java绑定来调用C/C++的OpenGL函数。 在这个例子中,"GLTry"可能是一个Android项目的名字,包含了必要的源代码文件。项目中可能包括以下几个关键部分: 1. *...
这个函数的链接指向Android文档,而在注释中链接的OpenGL文档则提供了更深入的技术细节。 通过这个教程,开发者可以逐步学习如何在Android应用中设置和使用OpenGL ES,创建复杂的3D图形和动画,同时理解如何有效地...
当调用OpenGL ES函数时,它们会根据当前状态来执行操作。 在Android中,我们通常通过`GLSurfaceView`来创建一个OpenGL ES的绘图表面。`GLSurfaceView`是一个专门用于OpenGL ES的视图组件,它管理了一个线程来处理...
为了实现旋转,我们可以使用`glRotatef()`函数在模型视图矩阵中添加旋转角度。在每一帧开始时,根据当前时间更新旋转角度,然后传递给OpenGL进行渲染。同时,法线向量也需要在变换后正确地归一化,以确保光照效果...
同时,OpenGL使用向量和矩阵运算来处理图形变换,包括平移、旋转和缩放。 2. **3D立方体绘制**:在OpenGL中,绘制一个立方体需要定义8个顶点,形成6个面,每个面由2个三角形构成。这些顶点的坐标需要按照特定顺序...
OpenGL是计算机图形学中的一个强大的库,用于在各种平台,包括Android,上创建3D和2D图形。在Android中,OpenGL ES(Embedded Systems的版本)被广泛使用,特别是对于游戏开发和复杂图形渲染。本篇文章将深入探讨...
OpenGL是计算机图形学中的一种广泛应用的编程接口,用于在各种操作系统和硬件上生成二维和三维图像。在Android平台上,OpenGL ES(Embedded Systems的缩写)是其子集,专为移动设备设计,提供了丰富的图形渲染功能。...
OpenGL ES是一个基于向量和矩阵运算的图形库,它提供了丰富的图形绘制函数,如顶点、颜色、纹理等的定义,以及绘制几何图形的方法。在Android中,我们通常使用`GLSurfaceView`作为渲染的视图,并创建一个`...
在OpenGL ES中,`glTranslatef(float x, float y, float z)`函数被用来执行平移操作。例如,将一个对象沿x轴方向移动4个单位可以通过调用`glTranslatef(4.0f, 0.0f, 0.0f)`实现。值得注意的是,平移变换可以累积,且...
OpenGL ES 是 Android 平台上用于2D和3D图形渲染的重要框架,它是OpenGL的一个轻量级版本,特别针对嵌入式设备设计。本教程将深入探讨如何使用Android的OpenGL ES来绘制一个逼真的地球仪,包括球体的构建、纹理映射...
"Android_openGL-S_3D"这个主题,意味着我们将探讨如何在Android平台上利用OpenGL ES进行3D图形编程。 一、OpenGL ES 3D基础 1. **坐标系统**:在3D空间中,OpenGL ES使用右手坐标系,原点位于屏幕中心,Z轴正方向...