当前位置: 代码迷 >> Android >> android.graphics.Camera, 3D 的成效
  详细解决方案

android.graphics.Camera, 3D 的成效

热度:437   发布时间:2016-05-01 13:47:03.0
android.graphics.Camera, 3D 的效果

Create simple effects for your images (IV) - 3D Projection

在 Android SDK 中有兩種 Camera classes。一個是android.hardware.Camera,這是用來操控相機功能的類別。另一個是android.graphics.Camera,這是什麼東西?今天我們就要來研究一下,這個類別能幫我們做些什麼事。

android.graphics.Camera 是一個可以讓你將 2D 物件在 3D 空間中移動,並將在其移動後的結果,畫在螢幕上的類別。

聽起來很有趣,是嗎?例如,最上面那張美女圖,你可以看出來,他是將原本的圖,以 Y 軸為軸心,旋轉約 30 度後,所畫出來的結果。

打開 android.graphics.Camera 的說明文件,你會發現,這個文件中只有下面這些 APIs 列表,什麼說明都沒有。

? ?1. //Public Constructors? ?
? ?2.? ?Camera()??
? ?3. //Public Methods??
? ?4.? ?void??applyToCanvas(Canvas canvas)??
? ?5.? ?float??dotWithNormal(float dx, float dy, float dz)??
? ?6.? ?void??getMatrix(Matrix matrix)??
? ?7.? ?void??restore()??
? ?8.? ?void??rotateX(float deg)??
? ?9.? ?void??rotateY(float deg)??
??10.? ?void??rotateZ(float deg)??
??11.? ?void??save()??
??12.? ?void??translate(float x, float y, float z)??

//Public Constructors Camera() //Public Methods voidapplyToCanvas(Canvas canvas) float dotWithNormal(float dx, float dy,float dz) void getMatrix(Matrix matrix) void restore() voidrotateX(float deg) void rotateY(float deg) void rotateZ(float deg) voidsave() void translate(float x, float y, float z)

不過,從這些 APIs 的名稱與參數,你應該可以猜出一些端倪。沒錯,這個 Camera class,其實是個 helperclass。他提供一些 APIs ,讓你控制要如何在 3D 空間中移動,最後再產生出合適的 Matrix ,讓你套用到 Canvas的座標體系上。關於 Matrix,我在 幫圖片加上影像特效 (I) - 陰影特效 已經介紹過他的強大,還不知道的,先讀一下這篇。

用個例子來解釋這個 Camera 類別的用法,是最適當的。底下這個簡單的程式片段的結果,就是最上面那張圖。其中的 m_bmp 就是原本的美女圖。

? ?1. camera = new Camera();??
? ?2. camera.translate(0, 0, 50);??
? ?3. camera.rotateY(30);??
? ?4. Matrix matrix3D = new Matrix();??
? ?5. camera.getMatrix(matrix3D);??
? ?6.? ?
? ?7. canvas.save();??
? ?8. canvas.translate(100, 100);??
? ?9. canvas.concat(matrix3D);??
??10.? ?
??11. canvas.drawBitmap(m_bmp, 0, 0, null);??
??12. canvas.restore();??

camera = new Camera(); camera.translate(0, 0, 50); camera.rotateY(30);Matrix matrix3D = new Matrix(); camera.getMatrix(matrix3D);canvas.save(); canvas.translate(100, 100); canvas.concat(matrix3D);canvas.drawBitmap(m_bmp, 0, 0, null); canvas.restore();

從這個範例程式中,我們知道,你可以利用 Camera.translate() 及 Camera.rotateXXX() 等 APIs 在 3D空間中移動。其實,這些 APIs 就是在操作 Matrix 的內容。最後,你只要呼叫 Camera.getMatrix() 即可將這Matrix 的內容抓出,並套到 Canvas 上。

在 Android ,要做出 3D 的效果,你當然可以用 OpenGL 的函式。不過,如果你需要更快的顯示速度,或者只是要做個簡單的 3D 特效,那千萬不要忘了這個 android.graphics.Camera。

1 楼 rnmichelle 2011-03-15  
文章是讲的简单明了,但是你的实例图(什么最上面的美女图)在哪啊?看不到效果嘛
2 楼 haojunming11 2011-09-21  

我在做相机开发,想设置其焦距
这是我从网上找到关于焦距设置的方案

就是手机上有个应用!它是可以实现变焦的!但是,我的应用不行;

Camera.getParameters().isZoomSupported() -->true
Camera.getParameters().isSmoothZoomSupported() -->false

这种情况下,我怎么才能实现变焦呢??

我有两个手机:
A.moto me1 ZoomSupported和SmoothZoom都是支持的,我测试了,可以实现变焦!
B.HTC G8就是上面这种情况,ZoomSupported支持,SmoothZoom不支持,所以调用:Camera.startSmoothZoom(zoom)就没反应了,但是它手机上带了一个拍照程序,有变焦功能,说明SmoothZoom不支持的情况下应该也是可以实现变焦功能的!
我尝试了,使用
Camera.getParameters().setZoom(zoom);
或者:
Camera.Parameters localParameters = mCamera.getParameters();
mCamera.getParameters().set("taking-picture-zoom", zoom);
localParameters.set("taking-picture-zoom", zoom);
都没反应!
是不是改变了zoom后,还需要是操作???


另外我将,HTC自带的拍照程序反编译了一下,它代码里,没有发现调用过:
Camera.startSmoothZoom(zoom);
但是有发现,调用过:
Camera.Parameters localParameters = mCamera.getParameters();
mCamera.getParameters().set("taking-picture-zoom", zoom);
localParameters.set("taking-picture-zoom", zoom);
还有就是发现它用了一个.so的动态链接库!

还有,Camera360这款软件,也实现了变焦!

不知道他们是怎么实现的!!???