android camera获取matrix作用于canvas的研究

网上查了一下相关的文章,认为自己看懂了,但是实际测试时和网上说的并不一样(后来研究发现,那个人写的是错的!!!),所以,在此提醒大家,要勇于质疑,勇于提出问题。

首先说明camera类,这个类位于package android.graphics 包下,用于图像3D变换,通过旋转、偏移等方式,最终通过getMatrix(Matrix)方法拿到矩阵,作用于canvas,使得画面呈现出立体效果。

camera的源码没什么看的,这里列举他的主要方法:

    public native void save();
    public native void restore();
    public native void translate(float x, float y, float z);
    public native void rotateX(float deg);
    public native void rotateY(float deg);
    public native void rotateZ(float deg);
    public native void rotate(float x, float y, float z);
    public native float getLocationX();
    public native float getLocationY();
    public native float getLocationZ();
    public native void setLocation(float x, float y, float z);
    public void getMatrix(Matrix matrix) {
        nativeGetMatrix(matrix.native_instance);
    }
    public void applyToCanvas(Canvas canvas) {
        nativeApplyToCanvas(canvas.mNativeCanvas);
    }
    public native float dotWithNormal(float dx, float dy, float dz);

这些方法看起来都不难,通过字面意思可以大致进行了解,其中最后几个方法目前还未研究,后面研究了补上。

接着我们来看看Camera变换的几个轴坐标,图有点难看哈。

这个才是正确的x, y ,z 轴坐标,而另外一个文章说的左手坐标系,经过我的验证那个作者写的是错误的。

camera位于坐标点O点(0,0,0),也就是图中的左上角

rotate

接着我们看如何旋转,我们假设可以转动图中坐标系,我们旋转坐标系,让X轴正方向指向我们,也就是说这时候我们看过去A点和O点重合了(能理解么?不能理解拿个方块东西转着自己看)。然后,这时候沿着顺时针进行旋转,然后我们从手机屏幕方向观察,就会发现变化了。

那我们再看一个例子:camera.rotateY(45)

他意思是绕y轴顺时针旋转45度。如果物体中间线和y轴重合,正绕y轴顺时针旋转45度就是指物体右半部分向里翻转,左半部分向外翻转;

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

camera.translate(40, 30, 30)的意思,在图中看就是把观察物体右移40,下移30,向z轴正方向移20(即让物体远离屏幕,即物体将会变小);

我们看几个图来加深理解:

首先原图:

进行变换:camera.rotateX(60);

进行变换: camera.rotateY(60);

进行变换:camera.rotateZ(-60); (这里是-60哈)

translate和canvas的偏移类似,这里不再上图示意。

时间: 2024-10-28 21:14:32

android camera获取matrix作用于canvas的研究的相关文章

Android camera 竖直拍照 获取竖直方向照片

竖直拍照 if (Integer.parseInt(Build.VERSION.SDK) >= 8) {     camera.setDisplayOrientation(90); } else {     if (getResources().getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT) {        parameters.set("orientation", "port

Android 3D旋转动画之Camera 和 Matrix

前面两篇博文讲解的都是Android 的2D动画效果,要想做出非常炫酷的3D动画效果怎么办?android 并没有提供3D动画接口给用户,所以我们得自己重写这样一个3D接口动画. 接口如下: /* * @Title: My3dAnimation.java * @Description: TODO<请描述此文件是做什么的> * @author: xjp * @data: 2014年9月15日 上午8:54:10 * @version: V1.0 */ package com.xjp.animat

【Android】Android Camera原始帧格式转换 —— 获取Camera图像(一)

 概述: 做过Android Camera图像采集和处理的朋友们应该都知道,Android手机相机采集的原始帧(RawFrame)默认是横屏格式的,而官方API有没有提供一个设置Camera采集图像的方向的方法,导致我们拿到原始帧后还需要再次对其进行转换为对应需求的数据,例如YUV的格式,图像的方向等(旋转多少度合适),下面我就粗略的介绍一下大致的流程,理解浅薄,大神请勿喷. 注意:当前还都是基于API<21的内容,如果压根不用android.hardware.Camera的话可能有区别,还没研

50、自定义View练习(四)高仿小米时钟-使用Camera和Matrix实现3D效果

*本篇文章已授权微信公众号 guolin_blog (郭霖)独家发布 本文出自:猴菇先生的博客 http://blog.csdn.net/qq_31715429/article/details/54668668 继续练习自定义View..毕竟熟才能生巧.一直觉得小米的时钟很精美,那这次就搞它~这次除了练习自定义View,还涉及到使用Camera和Matrix实现3D效果. 附上github地址: https://github.com/MonkeyMushroom/MiClockView 欢迎st

Android Graphics专题(1)--- Canvas基础

作为Android Graphics专题的开篇,毫无疑问,我们将讨论Android UI技术的核心概念--Canvas. Canvas是Android UI框架的基础,在Android的控件体系中,所有容器类.控件类在实现上都依赖于Canvas,界面的绘制实质上都是Canvas绘制的.本文将讨论Canvs的由来,并通过实例展示Canvas的基础用法. 对于应用开发而言,我们可以不去深究Canvas与Android 控件体系的实现细节,但明白Canvas与控件的关联有助于我们更好的使用Canvas

Android Camera探究之路——起步

Android Camera探究之路--起步 Camera在手机中有着举足轻重的地位,无论是二维码还是照片.识别.都离不开摄像头,本文将对Android中的Camera进行全面解析. 权限镇楼: <uses-permission android:name="android.permission.CAMERA"/> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE&

Android Camera开发之基础知识篇

概述 Android框架支持设备的相机拍照和录像功能,你的应用可以直接调用系统的Camera应用来拍照或者录像(比如微信拍照),当然也可以利用Android系统提供的API开发一个Camera应用来实现相机拍照和录像功能(比如市面上流行的360相机).此篇文章主要记录相机开发有关的基础知识,以及带着自己的理解翻译Camera官方文档,如有翻译不恰当支出,还请指出改正.当然我会开一个有关相机开发的一个系列,该系列主要内容包括如下: 相机基本预览拍照功能. 实现相机的Flash,Hdr,滤镜,前后摄

玩转Android Camera开发(一):Surfaceview预览Camera,基础拍照功能完整demo

杂家前文是在2012年的除夕之夜仓促完成,后来很多人指出了一些问题,琐事缠身一直没有进行升级.后来随着我自己的使用,越来越发现不出个升级版的demo是不行了.有时候就连我自己用这个demo测一些性能.功能点,用着都不顺手.当初代码是在linux下写的,弄到windows里下全是乱码.还要自己改几分钟才能改好.另外,很多人说不能正常预览,原因是我在布局里把Surfaceview的尺寸写死了.再有就是initCamera()的时候设参数失败,直接黑屏退出,原因也是我把预览尺寸和照片尺寸写死了.再有就

qcom Android Camera【转】

本文转载自:http://blog.csdn.net/Wilsonboliu/article/details/54949196 1.总体架构 Android Camera 框架从整体上看是一个 client/service 的架构, 有两个进程: client 进程,可以看成是 AP 端,主要包括 Java 代码与一些 native c/c++代码; service 进 程,属于服务端,是 native c/c++代码,主要负责和 Linux kernel 中的 camera driver 交互