转载:android camera 3d

版本: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、翻转 比如要实现一个图片翻转的效果,可以这样来写:

?


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

importandroid.graphics.Camera;

importandroid.graphics.Matrix;

importandroid.view.animation.Animation;

importandroid.view.animation.Transformation;

 

publicclassRotate3DAnimation extendsAnimation {

     // 3d rotate

     privatefloatmFromDegrees;

     privatefloatmToDegrees;

     privatefloatmCenterX;

     privatefloatmCenterY;

     

     privateCamera mCamera;

     

    publicRotate3DAnimation(floatfromDegrees,floattoDegrees)

    {

         mFromDegrees = fromDegrees;

         mToDegrees = toDegrees;

    }

 

     @Override

     publicvoidinitialize(intwidth,intheight,intparentWidth,

               intparentHeight)

     {

          super.initialize(width, height, parentWidth, parentHeight);

          mCenterX = width / 2;

          mCenterY = height / 2;

          mCamera = newCamera();

     }

 

     @Override

     protectedvoidapplyTransformation(floatinterpolatedTime, Transformation t)

     {

          

          finalfloatfromDegrees = mFromDegrees;

          floatdegrees = fromDegrees + (mToDegrees - mFromDegrees) * interpolatedTime;

          

          finalMatrix 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效果,只是翻转的效果,其实还有很多其他方面的,比如折叠等。以后会继续介绍,谢谢关注。

时间: 2024-10-13 13:54:35

转载:android camera 3d的相关文章

android camera(一):camera模组CMM介绍【转】

转自:http://blog.csdn.net/xubin341719/article/details/7723725 版权声明:本文为博主原创文章,未经博主允许不得转载. 关键词:android  camera CMM 模组 camera参数 平台信息: 内核:linux 系统:android 平台:S5PV310(samsung exynos 4210)  作者:xubin341719(欢迎转载,请注明作者) 下载:常用摄像头规格书(个别有android驱动程序)  :bf3703 30W.

基于Android实现3D翻页效果_Android

最近做了一个简单的3D效果翻页特效,先说说我的思路吧,首先我这个翻页效果并不是两个Activity之间的跳转,而是在同一个activity类切换不同的view而已.我现在的做法是单击一个button然后Gone当前的布局,然后把需要呈现的布局visible,在隐藏当前布局的时候启动动画,然后给动画添加监听,在动画结束时开始另外一个view的入场动画就行了. 下面来看下我的主页面的布局文件: <FrameLayout xmlns:android="http://schemas.android

Android Camera学习:Preview

Preview data Preview callback Android Camera小系统: 嗯--直接看Camera HAL层,它实现是主要的工作, 它一般通过ioctl调用V4L2 command ①从linux kernel中的camera driver①得到preview数据. 然后交给surface(或overlay)显示或者保存为文件.在HAL层需要打开对应的设备文件,并通过ioctrl访问camera driver. Android通过这个HAL层来保证底层硬件(驱动)改变,只

Android Camera学习:花落知多少

我对Android Camera的认识,会陆续的全部写下来,逐步完善大脑里的Camera网络. 1.Android Camera的2个独立进程 Android Camera 是C/S架构已经被说烂了,但是我还是要把这条记下来,因为我时常会脑袋短路,在client端做些无用的劳动希望来解决问题,那么这个希望真的就是奢望了. 核心自然不用说,是service端.service进程一直负责接收底层Camera 驱动传来的数据,然后传给surface显示出来. Client端也不是吃干饭的.Client

Android Camera学习:SmoothZoom

最近忙于项目中Camera的种种,由于大多数热衷于交流的Android开发者是在模拟器上进行开发,在涉及到硬件相关的实践内容上,(例如此刻我将记录的有关于Camera的变焦问题),网上可查询和借鉴的资料真是少的可怜.不过想想也是,项目中具体硬件的相关信息调试过程也不便公之于众.我不写细节,说说思路吧. 我所遇到的camera的变焦问题是这样的: zoom value 满足于区间:[0,28],平均对应smooth zoom的效果是放大1倍到8倍. 我将smoothzoom 从*1 拖到 *8 的

请教关于android camera 预览显示方向的一个问题。

问题描述 请教关于android camera 预览显示方向的一个问题. 请教关于android camera 预览显示方向的一个问题:有什么方法能够在android 1.6以上的设备都可以设置预览显示方向? 解决方案 大多数的相机程序都使用横向拍照,这也是摄像头传感器的自然方向.但是这并不影响您在竖屏的时候拍照,设备的方向信息会存储到图片的EXIF信息中.可以通过函数 setCameraDisplayOrientation() 来改变预览的显示方向而不影响图片的保存数据.然而,在API lev

照相机-android camera开始预览以后 数据时怎么刷到surfaceview上面的

问题描述 android camera开始预览以后 数据时怎么刷到surfaceview上面的 当camera打开以后 初始化 调用 initDisplayBuffers()以后 是如何刷新 界面的 也就是如何将数据传到屏幕的,代码看到了好久 ,也没有了解这个刷新机制,求指点. 解决方案 当APP调用系统API打开摄像头时,命令从framework到HAL,再到内核,内核的摄像头驱动会初始化摄像头接口,摄像头sensor,然后经由摄像头采集图像数据,存放到事先分配好的内存中.完成之后,内核会将存

3d-求解Android开发3D游戏的虚拟摇杆怎么做?

问题描述 求解Android开发3D游戏的虚拟摇杆怎么做? RT,如何实现3D手机游戏的虚拟摇杆功能,谁能给讲解一下,或分享个样例供大家学习学习? 解决方案 参考:http://imgtec.eetrend.com/blog/4326

camera action-调用系统裁切 com.android.camera.action.CROP 如何才能横屏裁切呢?

问题描述 调用系统裁切 com.android.camera.action.CROP 如何才能横屏裁切呢? 40C 现在拍照后,进入了裁切功能,固定比例是:长宽(2:1)考虑到拍照时,是横屏拍照的,裁切的时候也能要是横屏裁切,但是目前就是一直不能横屏裁切,只能是竖屏裁切. 以下是代码: Intent intent = MiniPic.other_getCropImageIntent(uri);// 裁剪 startActivityForResult(intent REQUEST_COUP); /