Android---OpenGLES之应用投影和摄像机视图

在OpenGL ES环境中,投影和摄像视图会让你绘制的对象在显示上更加接近眼睛所看到的物理对象。

这种物理视图的模拟是通体对被绘制对象的坐标的数学变换来完成的:

投影---这种变换会基于被绘制的的对象所在的GLSurfaceView的宽度和 高度来调整坐标。如果不进行这种计算,用OpenGL ES所绘制的对象就会由于视图窗口比例差异而发生不对称的现象。

通常只有在OpenGL视图被建立时,或者是你的渲染器的 onSurfaceChanged()方法中发生变化时,投影变换才会被计算。更多的有关OpenGL ES 投影和坐标映射的信息,请看“被绘制对象的坐标映射”。

摄像视图---这种变换是基于一个虚拟的摄像机的位置来调整被绘制对象的坐标。重点 要注意的是,OpenGL ES不会定义一个实际的摄像机对象,而是提供一些实用的模拟摄像机的方法来转换被绘制对象的显示。只有在建立GLSurfaceView时,或者是基于用 户操作或应用程序的功能的动态变化时,摄像机视图变换才可能被计算一次。

本文主要介绍如何创建投影和摄像机视图,并把它们应用到在GLSurfaceView中所绘制的图形上。

定义投影

用于投影变换的数据是在GLSurfaceView.Renderer类的onSurfaceChanged()方法中被计算的。以下示例代码要用到GLSurfaceView的高度和宽度,并使用Matrix.frustumM()方法来完成投影变换:

 
 
 
  1. @Override 
  2.   public void onSurfaceChanged(GL10unused, int width, int height) { 
  3.   GLES20.glViewport(0, 0, width, height); 
  4.   float ratio = (float) width / height; 
  5.   // this projection matrixis applied to object coordinates 
  6.   // in the onDrawFrame()method 
  7.   Matrix.frustumM(mProjMatrix, 0, -ratio, ratio, -1, 1, 3, 7); 
  8.   } 

这段代码填充了一个投影矩阵---mProjMatrix,然后你可以像下面的代码示例那样,在onDrawFrame()方法中,把它跟摄像机视图变换结合到一起。

注意:通常,只使用投影变换,会让你绘制的对象很空洞,因此为了让它能够在任何屏幕上显示,必须同时使用摄像机视图变换。

定义摄像机视图

通过把添加摄像机视图变换作为绘图过程的一部分,来完成被绘制对象的变换处理。在以下示例代码中,使用Matrix.setLookAtM()方法来计算摄像机视图变换,然后把它跟前面的投影矩阵计算结合到一起。然后用这个组合的变换矩阵来绘制图形。

 
 
 
  1. @Override 
  2.   public void onDrawFrame(GL10unused) { 
  3.   ... 
  4.   // Set the camera position(View matrix) 
  5.   Matrix.setLookAtM(mVMatrix, 0, 0, 0, -3, 0f, 0f, 0f, 0f, 1.0f, 0.0f); 
  6.   // Calculate theprojection and view transformation 
  7.   Matrix.multiplyMM(mMVPMatrix, 0, mProjMatrix, 0, mVMatrix, 0); 
  8.   // Draw shape 
  9.   mTriangle.draw(mMVPMatrix); 
  10.   } 

应用投影和摄像机变换

为了使用我们以上介绍的投影和摄像机视图的变换矩阵,需要编辑图形对象draw()方法,让它接收这个组合变换矩阵,并把它应用到图形上去:

 
 
 
  1. publicvoid draw(float[] mvpMatrix){// pass inthe calculated transformation 
  2. matrix 
  3.   ... 
  4.   // get handle to shape'stransformation matrix 
  5.   mMVPMatrixHandle = GLES20.glGetUniformLocation(mProgram, "uMVPMatrix"); 
  6.   // Apply the projectionand view transformation 
  7.   GLES20.glUniformMatrix4fv(mMVPMatrixHandle, 1, false, mvpMatrix, 0); 
  8.   // Draw the triangle 
  9.   GLES20.glDrawArrays(GLES20.GL_TRIANGLES, 0, vertexCount); 
  10.   ... 
  11.   } 

本文译自:http://developer.Android.com/tra ... ngl/projection.html

本文题目:Android---OpenGLES之应用投影和摄像机视图
本文URL:http://www.shufengxianlan.com/qtweb/news24/432624.html

网站建设、网络推广公司-创新互联,是专注品牌与效果的网站制作,网络营销seo公司;服务项目有等

广告

声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 创新互联