Android 360度全景照片展示
小弟初次写blog,文笔很普通,如有不当之处请多多谅解。话不多说,直接进入正题。
转载请标明出处:http://blog.csdn.net/x498980642/article/details/11890947
首先需要准备的装备以及工具是:
1.Android 2.2以上SDK
2.测试手机一台(数据线自备)
3.360度全景图片一张(项目源码中有,图片全部引用与网络)
360度的全景图片展示,需要面对的问题是,如何将一张全景图片转换为能够在手机上展示的立体图像,对于立体的3D图像,我们首先想到的是地球仪,在这里我需要介绍的是怎样将图片绑定在一个球上面,然后展示出来:
1.绘制球体:
在OpenGL ES中基本上所有的立体图像都是通过一个个的小三角形拼接而成的(关于OpenGL的基础知识我就不过多介绍了,CSDN中有关于OpenGL基础的专栏,大家可以去瞅瞅),我们知道球面上面的每一个点(P(x,y,z))都会满足方程组(球的极坐标方程):
x = r * sin(a) *cos(b)
y = r * cos(a)
z = r * sin(a)*sin(b)
其中 r为球的半径,a为线段 OP与 z轴正方向所夹角,b为 OP在xoy平面的投影 OP‘ 与x的正方向所夹角
我们可以根据这个方程组,通过控制∠a和∠b的变化,从上到下,逆时针的取得我们需要用来组合称三角形的点,然后我们需要将全景图片上的点与我们在球上面选取的点一一对应起来(注意:球的坐标是3维坐标,图片的坐标是2维坐标)
int perVertex = 36;double perRadius = 2 * Math.PI / (float) perVertex;double perW = 1 / (float) perVertex;double perH = 1 / (float) (perVertex);ArrayList<Float> vetexList = new ArrayList<Float>();ArrayList<Float> textureList = new ArrayList<Float>();for (int a = 0; a < perVertex; a++) {for (int b = 0; b < perVertex; b++) {float w1 = (float) (a * perH);float h1 = (float) (b * perW);float w2 = (float) ((a + 1) * perH);float h2 = (float) (b * perW);float w3 = (float) ((a + 1) * perH);float h3 = (float) ((b + 1) * perW);float w4 = (float) (a * perH);float h4 = (float) ((b + 1) * perW);textureList.add(h1);textureList.add(w1);textureList.add(h2);textureList.add(w2);textureList.add(h3);textureList.add(w3);textureList.add(h3);textureList.add(w3);textureList.add(h4);textureList.add(w4);textureList.add(h1);textureList.add(w1);float x1 = (float) (Math.sin(a * perRadius / 2) * Math.cos(b* perRadius));float z1 = (float) (Math.sin(a * perRadius / 2) * Math.sin(b* perRadius));float y1 = (float) Math.cos(a * perRadius / 2);float x2 = (float) (Math.sin((a + 1) * perRadius / 2) * Math.cos(b * perRadius));float z2 = (float) (Math.sin((a + 1) * perRadius / 2) * Math.sin(b * perRadius));float y2 = (float) Math.cos((a + 1) * perRadius / 2);float x3 = (float) (Math.sin((a + 1) * perRadius / 2) * Math.cos((b + 1) * perRadius));float z3 = (float) (Math.sin((a + 1) * perRadius / 2) * Math.sin((b + 1) * perRadius));float y3 = (float) Math.cos((a + 1) * perRadius / 2);float x4 = (float) (Math.sin(a * perRadius / 2) * Math.cos((b + 1) * perRadius));float z4 = (float) (Math.sin(a * perRadius / 2) * Math.sin((b + 1) * perRadius));float y4 = (float) Math.cos(a * perRadius / 2);vetexList.add(x1);vetexList.add(y1);vetexList.add(z1);vetexList.add(x2);vetexList.add(y2);vetexList.add(z2);vetexList.add(x3);vetexList.add(y3);vetexList.add(z3);vetexList.add(x3);vetexList.add(y3);vetexList.add(z3);vetexList.add(x4);vetexList.add(y4);vetexList.add(z4);vetexList.add(x1);vetexList.add(y1);vetexList.add(z1);}}mSize = vetexList.size() / 3;float texture[] = new float[mSize * 2];for (int i = 0; i < texture.length; i++) {texture[i] = textureList.get(i);}textureBuff = ByteBuffer.allocateDirect(texture.length * 4).order(ByteOrder.nativeOrder()).asFloatBuffer();textureBuff.put(texture);textureBuff.position(0);float vetex[] = new float[mSize * 3];for (int i = 0; i < vetex.length; i++) {vetex[i] = vetexList.get(i);}vertexBuff = ByteBuffer.allocateDirect(vetex.length * 4).order(ByteOrder.nativeOrder()).asFloatBuffer();vertexBuff.put(vetex);vertexBuff.position(0);}
2.将球上面的点与图片上面的点一一对应起来:
public static int initTexture(Context context, int drawableId)// textureId{int[] textures = new int[1];glGenTextures(1, textures, 0);int textureId = textures[0];glBindTexture(GL_TEXTURE_2D, textureId);glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);InputStream is = context.getResources().openRawResource(drawableId);Bitmap bitmapTmp;try {bitmapTmp = BitmapFactory.decodeStream(is);} finally {try {is.close();} catch (IOException e) {e.printStackTrace();}}GLUtils.texImage2D(GL_TEXTURE_2D, 0, bitmapTmp, 0);bitmapTmp.recycle();return textureId;}
glActiveTexture(GLES20.GL_TEXTURE0);glBindTexture(GL_TEXTURE_2D, textrueID);
3.最后我们只需要将这个球体绘制到屏幕上去就像行了
mProgram = TimGL2Utils.getProgram(mContext);glUseProgram(mProgram);mAPositionHandler = glGetAttribLocation(mProgram, "aPosition");mUProjectMatrixHandler = glGetUniformLocation(mProgram,"uProjectMatrix");mATextureCoordHandler = glGetAttribLocation(mProgram, "aTextureCoord");System.out.println("mAPositionHandler:" + mAPositionHandler);System.out.println("mUProjectMatrixHandler:" + mUProjectMatrixHandler);System.out.println("mATextureCoordHandler:" + mATextureCoordHandler);textrueID = TimGL2Utils.initTexture(mContext, R.drawable.p3);System.out.println("textureID:" + textrueID);glVertexAttribPointer(mAPositionHandler, 3, GL_FLOAT, false, 0,vertexBuff);glVertexAttribPointer(mATextureCoordHandler, 2, GL_FLOAT, false, 0,textureBuff);glEnableVertexAttribArray(mAPositionHandler);glEnableVertexAttribArray(mATextureCoordHandler);
glUniformMatrix4fv(mUProjectMatrixHandler, 1, false,getfinalMVPMatrix(), 0);glDrawArrays(GL_TRIANGLES, 0, mSize);
效果图:
附上源码下载地址:http://download.csdn.net/detail/x498980642/6300501
Android 360度全景照片展示相关推荐
- 360全景html插件,jquery实现360度全景展示特效插件
jquery.pano.js是一款可以实现360度全景展示特效的jquery插件.该360度全景展示特效支持使用鼠标拖拽移动图片,也可以通过左右导航按钮来移动图片.它兼容ie8浏览器,支持移动触摸设备 ...
- Panorama Viewer – jQuery 360度全景展示插件
jQuery Panorama Viewer 这款插件可以帮助你在网站中嵌入全景图片.要做到这一点,首先只需要在页面中引入最新的 jQuery 库,以及 jquery.panorama_viewer. ...
- 原生JS --360度全景展示
介绍:本案是鼠标任意在桌面上(左右)滑动,展示360度各个角度的展示图. 实现方法:要各个角度的图片(n张),图片名序号排列(0,1,2,3--n),通过鼠标点击事件(document.onmouse ...
- 10 个 jQuery 的360 度图片展示插件
整合jQuery的全景图片展示插件,能帮助你的网站访客更好的浏览你的网站图片.帮助你构建虚拟旅程,全景展示和滚动,无限的图片幻灯,希望大家喜欢! 相关的插件:分享8个图片360度旋转展示的jQuery ...
- 怎样做360度全景照片
怎样做360度全景照片举例 Panorama Maker4软件使用方法 怎样使用Panorama Maker4软件制作360度全景照片.按照软件的要求,制作所用的素材照片至少6张,但是要得到较 ...
- 全景图片怎么制作?360度全景展示系统都有哪些功能?
360度全景一般是指VR全景,在VR全景中我们可以通过旋转视角看到前后左右乃至上下,给人以身临其境的视觉效果.目前VR全景技术已是目前全球范围内迅速发展并逐步流行的一种视觉新技术.越来越多的商企.房产 ...
- [JavaScript案例]360度全景照片
案例: 360度全景照片 鼠标在页面上滑动时图片表现的物体会随着移动方向进行旋转,从而呈现360度物体旋转效果 思路: 将所有的图片都放入指定容器内,通过切换相应的照片隐藏与显示来实现旋转效果 代码: ...
- HTML技术 360度产品展示,360°产品展示
Circlr是一款可以对产品图片进行360度全方位旋转展示的插件.Circlr通过按一定角度规律拍摄的产品图片,制作出可以使用鼠标拖动.鼠标滚轮和移动触摸来进行图片逐帧旋转的效果.比先前的Roller ...
- 360度全景照片拍照
一.什么是360度全景? 全景又被称为3D实景,是指将拍摄的水平方向360度,垂直方向180度的多张照片拼接成一张全景图像.通过后期漫游制作,让浏览者能用鼠标控制浏览的方向,可左可右.可上可下观看物体 ...
最新文章
- mysql主键自增长空缺_Mysql 主键自增长auto_increment问题分析
- php递归内存,PHP递归的三种常用方式
- insert获取主键、联合关联查询
- python t检验_A or B A/B测试-python独立双样本t检验
- 植物大战僵尸食人花无cd逆向分析
- 在ubuntu上mysql出现ERROR 1045(28000):Access denied for user ‘young‘@’localhost‘(using password:NO)...
- 通过组策略实现客户端注册证书
- leetcode 112. Path Sum, 113. Path Sum II | 112,113. 路径总和 I, II(Java)
- LRU最近最少使用缓存集合
- 拥抱.NET Core系列:依赖注入(2)
- 【Java】jdk 1.8 新特性——Lambda表达式
- 旷视Face++与西交大成立AI联合实验室,郑南宁孙剑再续师徒缘
- ogre 1.9SDK阅读笔记
- labelImg安装与操作
- 思科CCNP在OSPF路由协议中的五类LSA是什么
- 神经元模型hhmodel模型_基于HH模型神经元动作电位的模拟与实现
- 常用html页面设计工具,网站前端开发常用工具大全-web设计师必备
- docker安装linux-ubuntu桌面环境
- SwiftUI 人工智能教程之图像识别植物或花朵通过图片和相机
- 多个公网服务器搭建k8s集群