温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

Android如何创建一个投影和一个相机视图

发布时间:2021-12-18 16:44:13 来源:亿速云 阅读:161 作者:iii 栏目:移动开发

这篇文章主要讲解了“Android如何创建一个投影和一个相机视图”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Android如何创建一个投影和一个相机视图”吧!

在OpenGL ES环境中,投影和相机视图让绘制对象以更接近于人们肉眼所看到的实物对象的样子显示。这项仿真技术是通过对绘制对象的坐标进行精确的数学变换而实现的。

投影:这种变换是根据所在GLSurfaceView的宽和高调整绘制对象的坐标。

如果没有此变换,对象会被不规则比例的视图所扭曲变形。

通常一个投影变换只有当创建OpenGLView或你的renderer类的 onSurfaceChange()方法发生变化时才被计算,更多关于OpenGL ES预测和坐标映射的信息,请参阅代码Mapping  Coordinates for Drawn Objects。

相机视图:这种变换是基于一个虚拟相机的位置来调整绘制对象的坐标。需要主要的 是,OpenGL  ES并没有定义一个真实的相机对象,而是提供了一些工具方法变换绘制对象的显示来模拟一个相机。一个相机视图变换可能在创建GLSurfaceView时 被计算一次,或根据用户行为或应用程序功能动态地改变。

这一节将描述如何创建一个投影和一个相机视图,并将它们应用于你的GLSurfaceView的形状绘制过程中。

一、定义一个投影

一个投影变换的数据是在GLSurfaceView.Renderer类的 onSurfaceChanged()方法中计算得到的。下面的示例代码演示了根据传入GLSurfaceView的宽和高计算比例,并使用Matrix 类frustumM()方法来填充一个投影变换:

[java] view plaincopyprint? @Override public void onSurfaceChanged(GL10 unused, int width, int height) { GLES20.glViewport(0, 0, width, height); float ratio = (float) width / height; // 在onDrawFrame()方法中,将投影矩阵应用到对象的坐标 Matrix.frustumM(mProjMatrix, 0, -ratio, ratio, -1, 1, 3, 7); }

这段代码填充了一个投影矩阵:mProjMatrix,可以把它与一个相机视图变换在onDrawFrame()方法中结合起来使用。

注:如果只是一个投影变换应用到你的绘制对象中,通常会导致什么也看不到。一般来说,你必须再申请一个相机视图变换才能看到屏幕上的东东。

二、定义一个相机视图

添加一个相机视图变换让你的绘制对象的变换流程变得更加完整。在下面的示例代码中,使用Matrix.setLookAtM()方法来计算相机视图变换,然后结合前面所计算的投影矩阵。将合并后的变换矩阵传递给绘制的形状。

[java] view plaincopyprint? @Override public void onDrawFrame(GL10 unused) { ... // 设置相机的位置(视图矩阵) Matrix.setLookAtM(mVMatrix, 0, 0, 0, -3, 0f, 0f, 0f, 0f, 1.0f, 0.0f); // 计算投影和视图变换 Matrix.multiplyMM(mMVPMatrix, 0, mProjMatrix, 0, mVMatrix, 0); // 绘制形状 mTriangle.draw(mMVPMatrix); }

三、应用投影和相机视图变换

为了使用合并后的投影和相机视图变换矩阵,需要修改你的图形对象的draw()方法,接收联合变换矩阵并应用到你的形状上:

[java] view plaincopyprint? public void draw(float[] mvpMatrix) { // 传递计算出的变换矩阵 ... // 获得形状的变换矩阵的handle mMVPMatrixHandle = GLES20.glGetUniformLocation(mProgram, "uMVPMatrix"); // 应用投影和视图变换 GLES20.glUniformMatrix4fv(mMVPMatrixHandle, 1, false, mvpMatrix, 0); // 绘制三角形 GLES20.glDrawArrays(GLES20.GL_TRIANGLES, 0, vertexCount); ... }

感谢各位的阅读,以上就是“Android如何创建一个投影和一个相机视图”的内容了,经过本文的学习后,相信大家对Android如何创建一个投影和一个相机视图这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是亿速云,小编将为大家推送更多相关知识点的文章,欢迎关注!

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI