基于Android平台的三维实时全景地图设计与实现(二)

14 篇文章 3 订阅
10 篇文章 0 订阅

2 三维全景地图系统的设计实现

2.1基于百度地图API的手机地图应用开发

在使用百度地图SDK所提供的各种LBS能力之前,需要获取百度地图移动版的开发密钥,该密钥与开发者的百度账户相关联。如图2所示。

图2 开发密钥申请创建应用成功后,便生成一个24位ak;一个应用有且仅对应唯一ak,重新设置时,“应用名称”“应用类别”均不可修改。

安装SDK,申请百度地图开发密钥,开发基于百度地图API的手机地图应用。

2.2搭建三维校园场景进行漫游渲染

目前从技术角度来说,三维虚拟漫游的最大难点在于精细建模和实时渲染。虽然随着计算机技术的不断进步,尤其是CPU 和GPU(graphics processing units)的迅猛发展,使开发虚拟漫游系统具备了一定的物质基础,但大规模漫游场景的渲染质量与实时性始终是不能避免的矛盾。所以搭建虚拟三维场景过程中应用的技术方法是需要解决的关键问题之一[4]。

实体建筑是虚拟校园场景中的主体部分,也是最重要的场景内容。通过以下步骤对实体建筑进行建模及优化:(1)获得建模数据。建筑外观与几何形状等要求准确的数据,在没有建筑图纸的情况下主要根据实地拍摄的照片

使用3ds Max 进行建模[4]。建模主要采用Mesh多边形网格的方式,最大限度的减少三维场景中模型的面数。

(2)可见性裁减技术。如图3所示,根据场景中不可见面片的种类,可以将可见性裁减分为视域裁减(View Frustum Culling)和遮挡剔除(Occlusion Culling)[4]。

图3 三种可见性裁剪方法

(3)去除冗余多边形。实体模型的冗余多边形主要是指在实体外部观察模型时不可见的部分[5]。由于场景漫游时它们处于不可见的位置,去除它们并不影响实体的视觉效果,而消除这些冗余多边形则可以在很大程度上降低场景的复杂度。

(4)使用纹理贴图。对于门、窗、栏杆等每栋建筑都具有且数量较大的细节部分,一般采取纹理贴图的方法,在对应位置的多边形表面上“贴制”纹理图片,用来代替详细的模型。这样处理可以减少模型的多边形数目和复杂程度,提高图像绘制速度和显示速度。

将搭建完成的三维场景导入Unity3D,利用Unity3D渲染引擎进行实时漫游及交互。

利用3ds Max软件完成建模和贴图后,发布成FBX 格式文件导入Unity3d系统。在发布文件前,需要将3ds max 中的单位设置为m,并且Y轴方向向上[6]。

通过Unity3D渲染引擎将场景的实时漫游发布为Android应用。

2.3关键技术

通过广播启动另一个应用的Activity,自定义ContentProvider进行数据传递:

ContentProvider是不同应用程序之间进行数据交换的标准Android API。应用程序通过ContentProvider以某种Uri 的形式对外提供数据,允许其他应用访问或修改数据;其他应用程序使用ContentResolver根据Uri去访问操作指定数据。

在地图应用中自定义ContentProvider接口,将地图软件获取到的定位信息暴露出来;三维漫游应用根据获取到的定位信息选择场景中指定的Camera,进行实时渲染。具体步骤如下:

(1)在Android Mainfest.xml文件中使用标签注册ContentProvider。(2)定义一个类MapContentProvider 继承自ContentProvider类;

(3)实现ContentProvider类中所有的抽象方法,包括onCreate()、getType()、query()、insert()、update ()、delete()等。由于ContentProvider暴露出来的数据和方法是提供给目标应用程序来调用,所以需要获取数据的三维漫游应用通过其ContentResolver对象调用的query()方法查询当前的定位信息。

(4)使用UriMatcher对象映射Uri返回代码;

(5)通过ContentObserver基类监听ContentProvider的数据改变

3系统运行与效果分析

本应用程序基于百度地图API完成地图的基础功能,通过Unity3D渲染引擎实现三维实时渲染。将本应用安装到基于Android2.3以上操作系统并具有定位功能的主流智能手机上,用户打开地图应用程序,在北京林业大学区域内通过定位获取用户位置并显示当前位置的实时渲染场景。通过地图画面显示和交互方式的创新,用户在快速确定自身位置的同时可以很轻松的将地图显示信息与当前位置对应统一,提高用户使用地图的效率。

当然本应用程序也存在一些不足之处。由于采用程序间数据共享的方式传递数据势必会影响应用程序启动的效率,并且随着地图应用范围的不断扩大三维场景实时渲染的进一步优化极为重要。这些问题可以在进一步研究中,通过设计优化接口以及Android与Unity3D消息传递的方式等方法进行改进。

小结:Android平台上将基于百度地图API开发的地图应用与通过Unity3D发布的三维实时漫游应用相结合并实现数据传递。采用自定义ContentProvider进行程序间数据共享的方式在Android应用开发中有一定的推广意义。进一步研究包括:实现三维场景的可复制性和功能的可扩展性,解决场景增多和信息量增加产生的加载延迟问题。

  • 1
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
Android平台实现基于OpenGL的三维图形建模与展示,需要以下步骤: 1. 设置OpenGL环境,创建渲染器和SurfaceView,并将渲染器与SurfaceView绑定。 2. 加载3D模型数据,包括模型的顶点坐标、法线向量、纹理坐标等信息,并转化为OpenGL所需的格式。 3. 在渲染器中实现三维模型的绘制,包括设置视角、投影矩阵、光照等参数,以及绘制模型的各个面。 4. 实现用户交互,包括触摸事件、手势识别等,使用户可以对模型进行旋转、缩放等操作。 下面是一个简单的示例代码,展示如何在Android平台下使用OpenGL ES 2.0绘制一个简单的三角形: ``` public class MyRenderer implements GLSurfaceView.Renderer { private float[] mTriangleVertices = { // X, Y, Z -0.5f, -0.25f, 0.0f, 0.5f, -0.25f, 0.0f, 0.0f, 0.559016994f, 0.0f }; private int mProgram; private int mPositionHandle; @Override public void onSurfaceCreated(GL10 gl, EGLConfig config) { GLES20.glClearColor(0.5f, 0.5f, 0.5f, 1.0f); mProgram = createProgram(vertexShaderCode, fragmentShaderCode); mPositionHandle = GLES20.glGetAttribLocation(mProgram, "vPosition"); } @Override public void onSurfaceChanged(GL10 gl, int width, int height) { GLES20.glViewport(0, 0, width, height); } @Override public void onDrawFrame(GL10 gl) { GLES20.glClear(GLES20.GL_COLOR_BUFFER_BIT | GLES20.GL_DEPTH_BUFFER_BIT); GLES20.glUseProgram(mProgram); GLES20.glEnableVertexAttribArray(mPositionHandle); GLES20.glVertexAttribPointer(mPositionHandle, COORDS_PER_VERTEX, GLES20.GL_FLOAT, false, vertexStride, vertexBuffer); GLES20.glDrawArrays(GLES20.GL_TRIANGLES, 0, vertexCount); GLES20.glDisableVertexAttribArray(mPositionHandle); } } ``` 该代码中,onSurfaceCreated()方法用于初始化OpenGL环境和着色器程序;onSurfaceChanged()方法用于设置视口大小;onDrawFrame()方法用于实现绘制逻辑。通过设置顶点坐标和着色器程序,我们可以在Android平台下绘制出一个简单的三角形。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

QY’UniverseSpace

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值