版本:1.0
日期:2014.4.14
版权:© 2014 kince 转载注明出处

一、概念

在Android中要想实现3D效果,第一个想到的应该就是OpenGL ES,因为在很多基础教材中几乎都提到了它。但是其使用起来还是稍微麻烦一些,而且它也主要用在游戏方面,那在应用方面有没有更好的选择呢?答案是肯定的,使用Camera类就可以完成3D效果。它有旋转、平移的一系列方法,实际上都是在改变一个Matrix对象,一系列操作完毕之后,我们得到这个Matrix,然后画我们的物体,就可以了。实际上内部机制还是opengl,不过大大简化了使用。

这么说可能有些朋友会有疑问,Camera不是相机方面的么,其实看完下面的图片就明白了。
不错,Camera在hardware包里面是负责相机方面的;在graphics包里面是图形方面的,不要混淆了。因此接下来主要说一下后者的一些用法,Camera用来计算3D转换、生成矩阵,然后应用在画布上。它的构造方法只有一个不带参数的Camera(),用于实例化一个带有空的转换的Camera。
Camera的坐标系是左手坐标系。如下图所示:

可以想象一下你Android设备平整的放在桌面上,X轴是手机的水平方向,Y轴是手机的竖直方向,Z轴是垂直于手机向里的那个方向。下面是一些细节:

1、camera位于坐标点(0,0),也就是视图的左上角;

2、camera.translate(10,20,30)的意思是把观察物体右移10,上移20,向前移30(即让物体远离camera,这样物体将会变小);

3、camera.rotateX(45)的意思是绕X轴顺时针旋转45度。举例来说,如果物体中间线和X轴重合的话,绕X轴顺时针旋转45度就是指物体上半部分向里翻转,下半部分向外翻转;

4、camera.rotateY(45)的意思是绕Y轴顺时针旋转45度。举例来说,如果物体中间线和Y轴重合的话,绕Y轴顺时针旋转45度就是指物体左半部分向外翻转,右半部分向里翻转;

5、camera.rotateZ(45)的意思是绕Z轴逆时针旋转45度。举例来说,如果物体中间线和Z轴重合的话,绕Z轴顺时针旋转45度就是物体上半部分向左翻转,下半部分向右翻转。

它的方法比较少,而且也都比较容易理解,但是都比较常用:

接下来说一下各个方法的用法:

1、applyToCanvas(Canvas canvas)

根据当前的变换计算出相应的矩阵,然后应用到制定的画布上去,注意是由画布来设置矩阵的。
2、rotateX(float degree)
绕着x轴旋转degree个度数
3、rotateY(float degree)
绕着y轴旋转degree个度数
4、rotateZ(float degree)
绕着z轴旋转degree个度数
5、translate(float x,float y,float z)
在x、y、z坐标轴上执行变换操作
6、save()和restore()
保存原状态,操作完之后,恢复到原状态
除此之外,还要有一个类来配合Camera来使用,那就是Matrix。Matrix用于处理三维的矩阵坐标变换,也常用于图片的处理。Matrix提供了translate(平移)、rotate(旋转)、scale(缩放)、skew(倾斜)四种操作,这四种操作的内部实现过程都是通过matrix.setValues(…)来设置矩阵的值来达到变换图片的效果。Matrix的每种操作都有set、pre、post三种操作,set是清空队列再添加,pre是在队列最前面插入,post是在队列最后面插入。除了translate,其他三种操作都可以指定中心点。

二、实例
1、翻转
比如要实现一个图片翻转的效果,可以这样来写:

import android.graphics.Camera;
import android.graphics.Matrix;
import android.view.animation.Animation;
import android.view.animation.Transformation;public class Rotate3DAnimation extends Animation {// 3d rotateprivate float mFromDegrees;private float mToDegrees;private float mCenterX;private float mCenterY;private Camera mCamera;public Rotate3DAnimation(float fromDegrees, float toDegrees){mFromDegrees = fromDegrees;mToDegrees = toDegrees;}@Overridepublic void initialize(int width, int height, int parentWidth,int parentHeight){super.initialize(width, height, parentWidth, parentHeight);mCenterX = width / 2;mCenterY = height / 2;mCamera = new Camera();}@Overrideprotected void applyTransformation(float interpolatedTime, Transformation t){final float fromDegrees = mFromDegrees;float degrees = fromDegrees + (mToDegrees - mFromDegrees) * interpolatedTime;final Matrix matrix = t.getMatrix();mCamera.save();mCamera.rotateY(degrees);mCamera.getMatrix(matrix);mCamera.restore();//matrix.preTranslate(-mCenterX, -mCenterY);matrix.postTranslate(mCenterX, mCenterY);}
}

看代码,首先重载了initialize()方法,在里面初始化中间坐标mCenterX、mCenterY以及实例化Camera对象,initialize()是一个回调函数告诉Animation目标View的大小参数,在这里可以初始化一些相关的参数,例如设置动画持续时间、设置Interpolator、设置动画的参考点等。applyTransformation (float interpolatedTime, Transformation t)函数来实现自定义动画效果,在绘制动画的过程中会反复的调用applyTransformation 函数。通过参数Transformation 来获取变换的矩阵(matrix),final Matrix matrix = t.getMatrix(),通过改变矩阵就可以实现各种复杂的效果。Camera类是用来实现绕Y轴旋转后透视投影的,首先通过t.getMatrix()取得当前的矩阵,然后camera.rotateY对矩阵进行旋转。preTranslate函数是在旋转前移动而postTranslate是在旋转完成后移动,主要作用是让对象围绕自己的中心二旋转。

三、总结
可以看到,要想实现3D效果,还要借助Animation类的配合,因为这个类正是动画类,提供了对象变换的平台。在Android apidemo中也有一个3D效果的程序,类名叫Rotate3dAnimation ,上面的代码真是这个Rotate3dAnimation的简化版本。本文介绍的3D效果,只是翻转的效果,其实还有很多其他方面的,比如折叠等。以后会继续介绍,谢谢关注。
源码下载

Android Camera 3D效果相关推荐

  1. android立体3D效果_Android实现八大行星绕太阳3D旋转效果

    code小生 一个专注大前端领域的技术平台公众号回复Android加入安卓技术群 作者:史蒂芬诺夫斯基链接:https://www.jianshu.com/p/2954f2ef8ea5声明:本文已获史 ...

  2. android camera 3d特效 详解与进阶

    1 概述 本篇主要讲解camera,这里的camera并不是照相相关的类,而是android.graphics.Camera,这个类中封装了一个matrix,不熟悉的同学可以看前面的文章来了解.and ...

  3. android立体3D效果_怀化400T吨龙门剪图纸3d模型_临沂1500T吨剪图纸原理图-皇宏液压...

    皇宏液压为您详细解读yddYIm怀化400T龙门剪图纸3d模型的相关知识与详情,   接触过超影3D印刷的伴侣们,想必必然对陈某们有所理解,超影3D印刷服务商拥有强大的3D印刷经历的团队,不单正在3D ...

  4. android立体3D效果_谷歌裸眼3D动物意外蹿红,掀起一股AR体验小高潮

    疫情在国外来势汹汹,越来越多人不得不长期待在家中.这个时候如果手指闲不住,不如试试在谷歌搜索中检索动物,就会有栩栩如生的 3D"动物"空降你家,而且其违和感已相较之前大大降低. 在 ...

  5. android 卡片3d效果_小米发布伸缩镜头技术:卡片机失业,多摄下岗?

    11月5日消息,小米在今天的MIDC 2020小米开发者大会上,发布了自研的"伸缩式大光圈镜头技术".顾名思义,就是在手机上加入类似卡片相机的可伸缩镜头,从而达到多焦段的拍照效果, ...

  6. android立体3D效果_3D立体画手绘墙体彩绘

    由于绘画表现形式的丰富多样,因此,墙体彩绘也不再仅仅局限于单调的平面图案效果,逼真的3D立体画作为墙体彩绘的一种表现形式,它呈现出来的逼真立体效果被广大时尚有个性的客户所追捧.它能给予人们强大的视觉冲 ...

  7. android立体3D效果_3D立体画,让你身临其境

    墙绘的出现,让墙面看起来更加美观,也提升了整面墙的美感度.从最开始的宗教墙绘,到现在的社区文化墙,家装彩绘,工装墙绘等等,其中有个具有独立风格的墙绘,以其逼真的效果被大众所熟知,那就是3D立体画. ​ ...

  8. android立体3D效果_PS教程:铝膜气球字制作的完整教程,3D立体效果字体的制作...

    这一篇主要是用PS做一种3D立体字体效果,铝膜气球字体,当然学会之后,举一反三,可以做成其他图案的铝膜气球效果. 铝膜气球在目前的各种庆典,婚庆,庆贺宴席上,用的比较普遍:这个字体效果,后期可以用于室 ...

  9. android立体3D效果_3D全息投影和平面投影有什么区别_广州全息投影

    随着时代的发展.科技的进步,3D全息投影已经融入到人们的日常生活当中,给人们带来全新的视觉体验,呈现亦真亦幻的虚拟影像世界,越来越多的行业肯定及选择全息投影技术.那么与传统的平面投影相比,3D全息投影 ...

最新文章

  1. 《预训练周刊》第7期:傅立叶图像变换器解析、阿里达摩院发布最大中文预训练语言模型PLUG
  2. numix Docky
  3. C++下关于XML开源库的使用
  4. cuda编程_CUDA编程入门(四)并行归约算法
  5. Log4j框架配置文件
  6. 基于哈夫曼编码完成的文件压缩及解压
  7. php域名墙检测,php 网站域名被墙判断请求方法
  8. KubeEdge 1.1 部署
  9. mysql备份到制定目录_写一个脚本定时自动备份mysql到指定目录
  10. Python中字符串的连接
  11. 是逻辑运算符 java_跟我学java编程—Java逻辑运算符
  12. TTS Service Extended (进程:com.google.tts)意外停止 恢复被阉割的TTS文字转语音功能
  13. linux系统,清理缓冲池内存
  14. MFC windows程序设计(第三版)课后习题第二章
  15. LeetCode 661. Image Smoother
  16. 【软件技巧】Transmission跳过检验(跳检)方法,适用于全平台
  17. 谷歌浏览器Chrome 100即将发布,但可能无法正常使用?
  18. matlab矩阵转入tecplot,[转载]tecplot编辑自己想要的变量
  19. W3C标准英文文献翻译方案
  20. WordPress丨关于国内的个人头像无法获取问题以及解决方案

热门文章

  1. 2019年上海地区最新JAVAEE开发面试与笔试题
  2. 苏州FreeNAS+ESXi5数据恢复案例
  3. 我与小娜(04):时空变换,亦真亦幻
  4. “水仙花数”你了解多少??
  5. Kotlin Weekly 中文周报 —— 16
  6. 《区块链原理、设计与应用》一3.8 本章小结
  7. Java String 类的方法
  8. exchange 2003 event id 1221
  9. SQL Serve权限管理
  10. iOS--React Native浏览器插件