androidopengles2.0(十七)——球形天空盒vr效果实现

author author     2023-04-08     398

关键词:

参考技术A 在3D游戏中通常都会用到天空盒,在3D引擎中也一般会存在天空盒组件,让开发者可以直接使用。那么天空盒是什么?天空盒又是如何实现的呢?本篇博客主要介绍如何在Android中利用OpenGLES绘制一个天空盒,并实现VR效果。

虽然大多数人知道这些东西是啥,但是我觉得我还是有必要把他们的定义“搬”过来,万一有人不知道呢。

天空盒的实现应该是最简单的,但是效果可能会有些瑕疵,尤其是顶着两面的交点处总能看出点不同。天空穹和天空球效果都差不多,会比天空盒好上很多,但是相对天空盒来说,比较耗性能。

在之前的博客中Android OpenGLES2.0(六)——构建圆锥、圆柱和球体有介绍如何绘制一个球,只不过之前的球是没有贴图的,现在我们绘制一个球,并为它贴上环境的贴图。就像绘制一个地球仪一样。

首先,首先我们需要得到球的顶点坐标和纹理坐标:

相应的顶点着色器和片元着色器分别为:

准备好了顶点坐标、纹理坐标和着色器,从顶点着色器中可以看出,我们还需要几个变换矩阵,变换矩阵求取:

这样,万事俱备,我们就可以编译glprogram,并进行球体的渲染了:

其中纹理图片如下:

渲染的结果如下:

绘制出球体之后,我们需要让球与手机的姿态进行同步,也就是当手机背面超下时,我们看到的应该是地面,手机背面朝上是,我们看到的应该是天空。很明显,这就需要用到手机中的传感器了。

Android中的传感器定义如下:

虽然在API中定义了这么多的传感器,然后实际上绝大多书手机都不会具备所有的传感器。所以当我们在使用某个传感器时,一定要检测这个传感器是否存在。
根据我们的需求,我们需要获得的是手机的姿态,所以上面的传感器中,我们能使用的方案如下:

我们直接使用旋转矢量传感器来获取手机姿态。传感器的使用相对来说比较简单:

然后再监听器中处理数据就可以了:

利用旋转矢量传感器我们很方便的获得了一个旋转矩阵,将这个矩阵传递到顶点着色器我们就可以让球体随着手机的姿态变化而变化了。
修改顶点着色器中顶点的计算为:

然后获取旋转矩阵的句柄并将旋转矩阵传递进来:

这样,球的旋转就和手机姿态同步了

然而我们需要的,并不是这样的结果,仔细想想,天空球模式的话,相机应该是在球的内部,我们看天空看大地,左看右看的时候,应该是人相机在动,而不是球在动。而我们现在看到的却是球自己转动。问题出在哪儿呢?
从 gl_Position=uProjMatrix*uViewMatrix*uRotateMatrix*uModelMatrix*vec4(aPosition,1) ;中可以看到,顶点的坐标计算中,我们是用从传感器获得的旋转矩阵在模型矩阵前,这样我们的旋转操作的就是球体,修改为:

这样,我们操作的就是相机了,得到的渲染结果如下,当摄像头对的方向变话,球在屏幕上的位置也会发生变换,就像我们头转动时,看到的东西在我们眼睛中成像的位置也会发生变化。

完成上述操作,我们里成功就剩下一步之遥了。上面的操作,我们始终在球的外面看球,就如同我们在外太空看地球一样。现在我们需要回到球的内部来看球。在获取矩阵时,我们的视图矩阵求法如下:

根据上面矩阵可以看到,很简单,我们只需要将相机位置改为球的圆心就可以了,当然也可以是球内的其他位置,但是效果上肯定是不如让相机和球心重合。

androidopengles2.0(十五)——利用egl后台处理图像

在AndroidOpenGLES2.0(十二)——FBO离屏渲染中,记录了采用FBO进行离屏渲染的方式来进行后台处理图像,但是在使用时,示例中还是用到了GLSurfaceView控件来提供GL环境。怎样完全抛开GLSurfaceView来进行图像处理呢&... 查看详情

androidopengles2.0——了解opengles2.0

什么是OpenGLES?OpenGL(全写OpenGraphicsLibrary)是指定义了一个跨编程语言、跨平台的编程接口规格的专业的图形程序接口。它用于三维图像(二维的亦可),是一个功能强大,调用方便的底层图形库。Open... 查看详情

androidopengles2.0——纹理贴图之显示图片

前面几篇博客,我们将了Android中利用OpenGLES2.0绘制各种形体,并在上一篇博客中专门讲了GLSL语言。但是我们看到的基于OpenGL开发的应用和游戏,可不仅仅是那些规则形体和一些简单的色彩构成,而是各种不规则的... 查看详情

androidopengles2.0(十八)——轻松搞定blend颜色混合(代码片段)

Blend是OpenGL中的一个非常重要的部分,它可以让每个输出的源和目的颜色以多种方式组合在一起,以呈现出不同的效果,满足不同的需求。Blend相关函数及意义在OpenGLES1.0中,Blend在OpenGLES固定的管线中,OpenGLES2.... 查看详情

androidopengles2.0(十八)——轻松搞定blend颜色混合(代码片段)

Blend是OpenGL中的一个非常重要的部分,它可以让每个输出的源和目的颜色以多种方式组合在一起,以呈现出不同的效果,满足不同的需求。Blend相关函数及意义在OpenGLES1.0中,Blend在OpenGLES固定的管线中,OpenGLES2.... 查看详情

androidopengles2.0(十六)——3d模型贴图及光照处理(obj+mtl)(代码片段)

在AndroidOpenGLES2.0(十四)——Obj格式3D模型加载中实现了Obj格式的3D模型的加载,加载的是一个没有贴图,没有光照处理的帽子,为了呈现出立体效果,“手动”加了光照,拥有贴图的纹理及光照又该怎... 查看详情

androidopengles2.0(十四)——obj格式3d模型加载

在博主《OpenGLES系列》文章中,最开始的几篇讲的就是OpenGL世界中各种形体的构建,但是那些形体都是规则的简单形体,遇到复杂的形体,比如说一个人、一朵花,怎么办呢?自然是通过其他工具类似于Maya... 查看详情

androidopengles2.0——fbo离屏渲染(代码片段)

之前的博客我们所做的示例都是直接渲染到屏幕上的,如果我们并不需要渲染到屏幕上,也就是离屏渲染,该怎么做呢?FBO离屏渲染是一个很好的选择。在这篇博客中,我们将以渲染摄像头数据为例,使用... 查看详情

androidopengles2.0——opengl中的平移旋转缩放

在前面的博客中,所有的例子都是一个对象,类似绘制圆锥绘制圆柱,我们都是传入一个参数,然后去控制那个圆面的位置,如果我们要绘制几个个正方形,它的位置、大小、方向都是不相同的,按照... 查看详情

androidopengles2.0(十三)——流畅的播放逐帧动画(代码片段)

在当前很多直播应用中,拥有给主播送礼物的功能,当用户点击赠送礼物后,视频界面上会出现比较炫酷的礼物特效。这些特效,有的是用粒子效果做成的,但是更多的时用播放逐帧动画实现的,本篇博客... 查看详情

Android OpenGL ES 2.0 模拟器

】AndroidOpenGLES2.0模拟器【英文标题】:AndroidOpenGLES2.0emulator【发布时间】:2012-02-1423:53:09【问题描述】:我有一台支持OpenGLES2.0(HTCDesire)的设备,当然,在设备上部署应用程序的速度要比在模拟器上快得多。默认的android模拟器不... 查看详情

Android OpenGL ES 2.0:具有不同定位对象的 VBA 和 VBO

】AndroidOpenGLES2.0:具有不同定位对象的VBA和VBO【英文标题】:AndroidOpenGLES2.0:VBAandVBOwithdifferentpositionedobjects【发布时间】:2014-10-2414:10:20【问题描述】:所以我正在做一个有点像Minecraft的项目,其中有数千个立方体。我很早就遇... 查看详情

Android OpenGL ES 2.0 重用前一帧

】AndroidOpenGLES2.0重用前一帧【英文标题】:AndroidOpenGLES2.0reusepreviousframe【发布时间】:2015-03-1219:25:47【问题描述】:我正在寻找一个最小的示例,其中每个帧都将重用前一帧中的三角形。我一直在尝试一遍又一遍都没有成功,所... 查看详情

exchange2016(十七)

 Exchange2016(十七)本文出自“赵东伟的博客”博客,请务必保留此出处http://zhaodongwei.blog.51cto.com/4233742/1948094 查看详情

第八十七天

周一05-02普通的一天 查看详情

第七十七天

周五早上,不去,没点名哈哈下午,去了学习此外无事发生 查看详情

doozyui⭐️十七progresstargetxxx

文章目录 查看详情

第五十七天

四月一号,愚人节,也没啥早餐不吃,午饭晚饭点的外卖照常打游戏,今天游戏里面手感操作都不错,好耶 查看详情