安卓 OpenGLES 魔方
今天依旧在导师的公司里打杂,然而没有博客可以写,因为改了一天的bug,此处很想嘈一下前端的同学真的很不爱沟通,花费好久也没讲清楚要求是什么,我只能直接看他发送HTTP请求的代码来判断我需要做什么了。好了,扯远了,因为改了一天的bug,所以没有什么新的知识点可以写,我决定今天总结一下我上个学期(刚结束的学期)写的一个项目,项目中我主要负责的是安卓端的功能实现,我的另一个队友则是负责后台的算法服务,所以我主要讲一下安卓端的情况。
首先,当然需要介绍一下整个项目究竟是做什么的。我们的产品最终功能是扫描录入真实魔方的色块信息,以此为基础生成一个相同的3D魔方,用户可对该3D魔方进行旋转(整体旋转或者是单层旋转)操作,也可以选择利用我们的还原算法,查看魔方还原(播放还原动画)。
因为是创新实践课的课程大作业,因此写了一份项目报告,报告里技术细节写了一大堆,然而确实真的也没办法具体讲每个小功能是如何实现的,所以我就概括描述一下几个大方面以及讲一下我印象深刻的问题或者是错误了。
1.虚拟3D魔方
1)建模
立体魔方建立主要就是用到了OpenGL ES,在做这个项目之前,我完全没有接触过OpenGL ES(具体来说,看过一些OpenCV),所以是边学习边做的项目,具体的实现过程可想而知,就是先尝试着绘制了一个三角形,两个三角形可以组成一个矩形平面,而6个矩形平面则可以完成一个立方体,这是我的第一步,因为教程很多,我就不描述具体的实现了。
接着我开始思考,魔方由27个立方体组成,每个立方体的不同的面颜色又不同,那么我至少需要实现能够单独给某个立方体的某个面涂色吧。我的第一个问题就是在这里出现的。由于我一开始参考的立方体绘制的Demo采用的是顶点索引法的填色方式,因此改变一个顶点的颜色,将会影响到3个面,这显然是不符合要求的。解决方法自然是采用非索引法了,这样子就可以非常容易得实现规定每个面的颜色了,实验结果如下图。
接下来,就是利用27个立方体组成一个魔方了。由于已经实现了单个立方体的绘制,因此这部分只需要知道怎么控制每个立方体在世界坐标系中的位置就可以了呀!利用我在OpenCV里学到的只是,这可以通过移动画布实现啊!确实是非常顺利得实现了,如果觉得这里有困难的话,可以去看一下几个坐标系的定义和它们之间的关系,是十分重要的!顺带提一下,为了体现各个立方体之间的缝隙,我查了半天的如何绘制矩形边框,后来被我队友一句话点醒了。你只要两个立方体物体坐标的中心略大于矩形边长,不就自然有缝隙了吗。还真是,立马就将27个立方体之间两两分开来了,果然脑动在编写代码的时候也是很重要的!最终的效果大概如下图所示。
到这里我就完成我的魔方建模的工作了,当然需要更美观的话,可以考虑贴图什么的,我因为时间原因,没有去具体实现。
2)旋转
魔方旋转这个部分真的花了我不少的时间,主要原因还是在于对于几个坐标系的不理解(再次!坐标系真的很重要!),单次旋转的时候,由于OpengGl ES提供了图像旋转的函数,所以非常方便。无非就是遍历需要旋转的立方体变量,然后让它们都执行一次旋转就是了。但是如果在旋转一次后,还需要旋转呢。我发现,完全乱了!不管是旋转的立方体的选择,还是旋转这个动作本身。
首先是旋转这个动作本身来看,我直接说解决方法了。就是说在每次旋转后,必须要把当前的旋转矩阵压到栈里面保存起来,不然的话,每一次旋转都是从初始状态开始,当然不对了。还有需要强调的就是,用栈保存!我一开始特别傻的用了数组去保存,一直不对,改成了栈居然立马就可以了,虽然没搞清楚缘由,但是希望大家不会像我一样因为这个原因找半天的bug。
旋转本身还有一个问题,就是经历一次旋转后,立方体的物体坐标系显然和世界坐标系的关系发生了变化,而我的观察角度确实相对于世界坐标系发生的,所以说比如我需要让某个立方体进行一次R旋转,但对于其来说,在其物理坐标系中,进行的确未必是R旋转。当然,相信这一定有好的解决方法,而我采用的是非常浅显粗暴的方法,就是记录下来。以R旋转为例,其物体坐标系的变化如下,是非常有规律的,且类别不多,完全是可以记录的。
再者是选择旋转的魔方,每次旋转,27个立方体中必然有几个立方体的位置在世界坐标系中发生了变化,那么下一次旋转需要让哪几个立方体发生旋转,也成了需要考虑的问题。我一开始的想法自然是,遍历27个立方体,判断它们当前所在的位置,然后失败了。我根本不知道该怎么获取位置信息(这也涉及到几个坐标系转换的问题了,坐标系真的很重要!),最终我依旧采用了简单粗暴的方法来解决问题,我建立了一个类,记录虚拟的x,y,z坐标,也就是在每次旋转后,对发生了位置变化的立方体都进行一次虚拟坐标的更新。和上图的物体坐标转换一样,这也是有规律可循的,且比构想中的要简单许多,完全不必要害怕这样子工程量十分浩大。比如进行一次R旋转,显然这只是x坐标不变,y坐标是原z坐标取负,z坐标是原来的y坐标,非常简单。
3)触屏旋转
为了能有更好的交互性,触屏旋转自然是必不可少的。左滑右滑上滑下滑显然是很好判断的。最难的莫过于判断触屏点的位置,当然,获取坐标并不难,难的是如何判断落在哪个立方体上。查了很多资料,说是射线提取,其实我并不是很懂,这部分是队友帮忙一起写的,所以我也是不敢随便写在博客上,怕误导了人。总之也就是从世界坐标系,通过视变换变成照相机坐标系,再经过投影变化到裁剪坐标系,再经过透视除法和视口变换转换到视频坐标系。大概流程是这样子的,其实就是一堆矩阵运算的过程,再次,坐标系和坐标系的转换真的很重要!
2.提取颜色信息
其实这部分基本上就是算法的工作了,而我这里就只是提供了一个拍摄功能而已。也就是获取摄像头权限(注意,目前的安卓 系统都是需要动态获取了哦),预览,根据用户要求拍摄照片,然后把照片信息发给服务端,仅此而已。碰到的问题主要是预览变形的问题,网上也有不少的解决方法,建议可以自行搜索,还有就是照片质量太高,传递给服务器和返回来耗时太长了,所以在发送照片前,可以压缩一下图像,就完全不会有问题了。
3.成果
最后的最后,想给大家得瑟一下最终的成品,还是获得了老师非常高的评价的!啊,顺带一提,还原算法是直接扒了一份,算法那边的同学确实也是来不及,也跟老师交代了还原算法不是我们的,此处指路 http://www.cbarker.net/projects/cubr
首先是几个主要的界面:
接着是视频:
链接:https://pan.baidu.com/s/1_WNRsLQGFa21k4k4lbc9nQ 密码:eyop
最后是源代码(因为服务器是队友买的,我也不知道他会不会不续费了,所以如果因为服务器没法用的话,还请大家见谅):
等下次贴!
安卓 OpenGLES 魔方相关推荐
- 安卓使用opengles显示深度点云图或深度3D效果图
前言:因为想在安卓设备上显示深度图的3D效果画面,经过查找资料,发现使用opengles比较方便.本文基于opengles在安卓设备实现3D点云效果图显示,而且深度图上点的颜色由近及远,从红-黄-绿- ...
- 酷比魔方可以PHP编程么,尝试在安装了x86安卓系统的设备酷比魔方i7手写版上手工添加Magisk --准备工做...
=======适用于Cube i7 Stylus的安卓6.0.1======================php https://www.youtube.com/watch?v=266tAxPITu ...
- 尝试在安装了x86安卓系统的设备酷比魔方i7手写版上手工添加Magisk --准备工作
=======适用于Cube i7 Stylus的安卓6.0.1====================== https://www.youtube.com/watch?v=266tAxPITuA h ...
- cube station下载_cubestation魔方软件下载-cubestation安卓版v1.4.4_5577安卓网
cubestation是一款非常好用的休闲娱乐类魔方软件,软件界面简洁,汇集了丰富的魔方详细信息,用户可以通过软件学习到大量的魔方教程和知识,欢迎下载使用~ [软件说明] <Cube Stati ...
- cube station下载_Cube Station软件下载-Cube Station(魔方)下载v1.4.4安卓版-西西软件移动版下载...
Cube Station是一款专门为热爱魔方的朋友打造的全球在线竞技平台,用户可以使用这款软件轻松地查看自己的复盘数据,还可以随时随地的和全球魔友进行在线竞技,喜欢的朋友可以来西西下载Cube Sta ...
- MAC上可以用的连接安卓、苹果手机的全功能助手-魔方手机助手
作为Mac上第一款连接Android的手机助手,魔方的初衷始终没有改变:把产品做到极致,让用户感受魔方的魅力.无论是Mac版的独树一帜还是 Windows版的精益求精,我们都希望大家对"手机 ...
- 首款AI看球机器人亮相北京,已上线IOS版和安卓版
3月9日,魔方元科技在北京举办"机器人陪你看世界杯"为主题的产品沟通分享会,发布了其自主研发的产品"AI球".据悉,"AI球"是首款立足于足 ...
- unity发布安卓黑屏_Unity将携十余爆款新游和多个独立游戏亮相ChinaJoy 2020
2020年7月15日,上海– 今日,全球领先的实时3D内容创作平台Unity宣布,将携十余个多品类Made with Unity爆款新游.多个独立游戏,以及Unity最新的产品和技术支持服务亮相Chi ...
- 安卓scrollview无法滑动_安卓上线前,小光有话想对你们说
亲爱的旅人们, 让大家久等了. 大家已经知道了,<光·遇>安卓平台将在2020年7月9日上线.小光很高兴能给大家宣布安卓上线这个消息.在这之前,小光和上千万的安卓预约玩家一样,同样期盼着这 ...
最新文章
- MIna框架I/O Service层设计
- Hibernate generator
- Angular之RouterModule的forRoot与forChild
- UVA10843——Anne\'s game
- 闪退没由报错_关于floor()报错注入,你真的懂了吗?
- 【葫芦娃团队】无人转会申请
- STM32电机库(ST-MC-Workbench)学习记录——电流采样参数设置
- 企业信息化到底是不是一把手工程
- 通用对话框Dialog
- Windows 10操作系统常用快捷键介绍
- 利用sql profile固定执行计划加快OGG同步
- 【ssl认证、证书】java中的ssl语法API说明(SSLContext)、与keytool 工具的联系
- Java官方教程(三-2)赋值 运算和一元运算符(2020.12.19)
- Adobe Reader添加书签
- 调查研究论文的描述性统计结果该如何分析讨论?
- 摇摇棒C语言程序,摇摇棒代码C语言.doc
- jQuery筛选中的查找的语法
- 建筑学计算机快速设计,大二建筑学建筑设计第一次用电脑出图,不知道详细的制图步骤。就是需要用到那些软件。流程怎样?...
- 会计电算化什么是计算机硬件,2008年初级会计职称:会计电算化计算机的硬件...
- MindManager 2020 Win v20.1.238思维导图软件开心版安装教程
热门文章
- Linux系统/etc/resolv.conf文件为只读模式,且无法更改权限
- Linux 中的内存管理单元MMU
- Android Studio生成二维码
- 失传万年的PS合成进阶宝典(一)
- 关于mysql Error 1045(28000):Access denied for user ‘root‘@‘localhost‘(using password:YES)的处理方法
- MySQL学习笔记整理(上部)
- ISO文件怎么安装?
- 一些我们关于端到端语音翻译的思考和尝试
- 奶茶新手加盟奶茶品牌培训哪些技能?
- Mac(Big Sur系统)安装tunnelblick(vpn)步骤