您的位置 首页 硬件

Android OpenGL ES开发:投影和相机视图创建和使用

Android OpenGL ES开发:投影和相机视图创建和应用-OpenGL ES环境允许你以更接近于你眼睛看到的物理对象的方式来显示你绘制的对象。

OpenGL ES环境答应你以更接近于你眼睛看到的物理目标的办法来显现你制作的目标。物理检查的模仿是经过对你所制作的目标的坐标进行数学改换完结的:

•  Projection — 这个改换是根据他们所显现的GLSurfaceView的宽和高来调整制作目标的坐标的。没有这个核算改换,经过OpenGL制作的形状会在不同显现窗口变形。这个投影改动一般只会在OpenGL view的份额被确认或许在你渲染器的onSurfaceChanged()办法中被核算。想要了解更多的关于投影和坐标映射的相关信息,请看制作目标的坐标映射。

•  Camera View — 这个换是根据虚拟的相机的方位来调整制作目标坐标的。需求侧重留意的是,OpenGL ES并没有界说一个实在的相机目标,而是供给一个有用办法,经过改换制作目标的显现来模仿一个相机。相机视图改换或许只会在你的GLSurfaceView被确认时被核算,或许根据用户操作或你运用程序的功能来动态改动。

本课程描绘怎样创立投影和相机视图并将其运用的到你的GLSurfaceView的制作目标上。

Android OpenGL ES开发:投影和相机视图创立和运用

界说投影

投影改动的数据是在你GLSurfaceView.Renderer类的onSurfaceChanged()办法中被核算的。下面的示例代码是获取GLSurfaceView的高和宽,并经过Matrix.frustumM()办法用它们填充到投影改换矩阵中。

// mMVPMatrix is an abbreviaTIon for “Model View ProjecTIon Matrix” private final float[] mMVPMatrix = new float[16]; private final float[] mProjecTIonMatrix = new float[16]; private final float[] mViewMatrix = new float[16]; @Override public void onSurfaceChanged(GL10 unused, int width, int height) { GLES20.glViewport(0, 0, width, height); float raTIo = (float) width / height; // this projection matrix is applied to object coordinates // in the onDrawFrame() method Matrix.frustumM(mProjectionMatrix, 0, -ratio, ratio, -1, 1, 3, 7); }

上面的代码填充有一个投影矩阵mProjectionMatrix,mProjectionMatrix能够在onFrameDraw()办法中与下一部分的相机视图结合在一同。

留意:假如仅仅只把投影矩阵运用的到你制作的目标中,一般你只会得到一个十分空的显现。一般情况下,你还必须为你要在屏幕上显现的任何内容运用相机视图。

界说相机视图

经过在你的渲染器中增加相机视图改换作为你制作进程的一部分来完结你的制作图画的改换进程。鄙人面的代码中,经过Matrix.setLookAtM()办法核算相机视图改换,然后将其与之前核算出的投影矩阵结合到一同。兼并后的矩阵接下来会传递给制作的图形。

@Override public void onDrawFrame(GL10 unused) { … // Set the camera position (View matrix) Matrix.setLookAtM(mViewMatrix, 0, 0, 0, -3, 0f, 0f, 0f, 0f, 1.0f, 0.0f); // Calculate the projection and view transformation Matrix.multiplyMM(mMVPMatrix, 0, mProjectionMatrix, 0, mViewMatrix, 0); // Draw shape mTriangle.draw(mMVPMatrix); }

运用投影和相机改换

为了运用在上一部分内容中展现的投影和相机视图改换的兼并矩阵,首要要在之前Triangle类中界说的定点着色器代码中增加一个矩阵变量:

public class Triangle { private final String vertexShaderCode = // This matrix member variable provides a hook to manipulate // the coordinates of the objects that use this vertex shader “uniform mat4 uMVPMatrix;” + “attribute vec4 vPosition;” + “void main() {” + // the matrix must be included as a modifier of gl_Position // Note that the uMVPMatrix factor *must be first* in order // for the matrix multiplication product to be correct. ” gl_Position = uMVPMatrix * vPosition;” + “}”; // Use to access and set the view transformation private int mMVPMatrixHandle; … }

下一步,修正你的图形目标的draw()办法来接纳联合改换矩阵,并将它们运用到图形中:

public void draw(float[] mvpMatrix) { // pass in the calculated transformation matrix … // get handle to shape's transformation matrix mMVPMatrixHandle = GLES20.glGetUniformLocation(mProgram, “uMVPMatrix”); // Pass the projection and view transformation to the shader GLES20.glUniformMatrix4fv(mMVPMatrixHandle, 1, false, mvpMatrix, 0); // Draw the triangle GLES20.glDrawArrays(GLES20.GL_TRIANGLES, 0, vertexCount); // Disable vertex array GLES20.glDisableVertexAttribArray(mPositionHandle); }

一旦你正确的核算并运用投影和相机视图改换,你的绘图目标将会以正确的份额制作,它看起来应该像下面这样:

Android OpenGL ES开发:投影和相机视图创立和运用


现在你已经有一个能够以正确份额显现图形的运用了。后边的章节,咱们能够了解如何为你的图形增加运动了。

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/qianrushi/yingjian/93029.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部