资源描述:
《Android OpenGL ES开发:投影和相机视图创建和应用.doc》由会员上传分享,免费在线阅读,更多相关内容在应用文档-天天文库。
1、AndroidOpenGLES开发:投影和相机视图创建和应用 OpenGLES环境允许你以更接近于你眼睛看到的物理对象的方式来显示你绘制的对象。物理查看的模拟是通过对你所绘制的对象的坐标进行数学变换完成的: • Projection—这个变换是基于他们所显示的GLSurfaceView的宽和高来调整绘制对象的坐标的。没有这个计算变换,通过OpenGL绘制的形状会在不同显示窗口变形。这个投影变化通常只会在OpenGLview的比例被确定或者在你渲染器的onSurfaceChanged()方法中被计算。想要了解更多的关于投影和坐标映
2、射的相关信息,请看绘制对象的坐标映射。 • CameraView—这个换是基于虚拟的相机的位置来调整绘制对象坐标的。需要着重注意的是,OpenGLES并没有定义一个真实的相机对象,而是提供一个实用方法,通过变换绘制对象的显示来模拟一个相机。相机视图变换可能只会在你的GLSurfaceView被确定时被计算,或者基于用户操作或你应用程序的功能来动态改变。 本课程描述怎样创建投影和相机视图并将其应用的到你的GLSurfaceView的绘制对象上。 定义投影 投影变化的数据是在你GLSurfaceView.Renderer类的
3、onSurfaceChanged()方法中被计算的。下面的示例代码是获取GLSurfaceView的高和宽,并通过Matrix.frustumM()方法用它们填充到投影变换矩阵中。 //mMVPMatrixisanabbreviaTIonfor“ModelViewProjecTIonMatrix”privatefinalfloat[]mMVPMatrix=newfloat[16];privatefinalfloat[]mProjecTIonMatrix=newfloat[16];privatefinalfloat[]mViewMa
4、trix=newfloat[16];@OverridepublicvoidonSurfaceChanged(GL10unused,intwidth,intheight){GLES20.glViewport(0,0,width,height);floatraTIo=(float)width/height;//thisprojectionmatrixisappliedtoobjectcoordinates//intheonDrawFrame()methodMatrix.frustumM(mProjectionMatrix,0,-rati
5、o,ratio,-1,1,3,7);} 上面的代码填充有一个投影矩阵mProjectionMatrix,mProjectionMatrix可以在onFrameDraw()方法中与下一部分的相机视图结合在一起。 注意:如果仅仅只把投影矩阵应用的到你绘制的对象中,通常你只会得到一个非常空的显示。一般情况下,你还必须为你要在屏幕上显示的任何内容应用相机视图。 定义相机视图 通过在你的渲染器中添加相机视图变换作为你绘制过程的一部分来完成你的绘制图像的变换过程。在下面的代码中,通过Matrix.setLookAtM()方法计算相机视图
6、变换,然后将其与之前计算出的投影矩阵结合到一起。合并后的矩阵接下来会传递给绘制的图形。 @OverridepublicvoidonDrawFrame(GL10unused){...//Setthecameraposition(Viewmatrix)Matrix.setLookAtM(mViewMatrix,0,0,0,-3,0f,0f,0f,0f,1.0f,0.0f);//CalculatetheprojectionandviewtransformationMatrix.multiplyMM(mMVPMatrix,0,mProje
7、ctionMatrix,0,mViewMatrix,0);//DrawshapemTriangle.draw(mMVPMatrix);} 应用投影和相机变换 为了使用在上一部分内容中展示的投影和相机视图变换的合并矩阵,首先要在之前Triangle类中定义的定点着色器代码中添加一个矩阵变量: publicclassTriangle{privatefinalStringvertexShaderCode=//Thismatrixmembervariableprovidesahooktomanipulate//thecoordinat
8、esoftheobjectsthatusethisvertexshader“uniformmat4uMVPMatrix;”+“attributevec4vPosition;”+“voidmain(){“+//thematrixmust