2012-11-09 18 views
2

我有一個CanvasBitmap。我必須在畫布上繪製位圖的兩倍和旋轉them.This是我的代碼:使用「黑客帝國」旋轉兩個「位圖」

Bitmap bitmap = ... ; 
Matrix matrix = new Matrix(); 
Camera camera = new Camera(); 
camera.save(); 

// First drawing: 
camera.rotateX(x_rotate_angle); 
camera.rotateY(y_rotate_angle); 
camera.getMatrix(matrix); 
matrix.postTranslate(0, 0); 
matrix.postScale(3, 3); 
canvas.drawBitmap(bitmap, matrix, null); 
camera.restore(); 

// Second drawing: 
camera.rotateX(x_rotate_angle); 
camera.rotateY(y_rotate_angle); 
camera.getMatrix(matrix); 
matrix.postTranslate(10, 10 + bitmap.getHeight()); 
matrix.postScale(3, 3); 
canvas.drawBitmap(bitmap, matrix, null); 

旋轉之前結果:

enter image description here

位圖時僅旋轉X軸,所有的東西都fine.In這種情況下,結果是這樣的:

enter image description here

在上述兩種圖像,你可以看到,所有的邊緣都parallel。但當位圖旋轉軸線Y,邊緣將不平行(頂部位圖的底部邊越過底部位圖的頂邊):

enter image description here

我做錯了什麼?

回答

4

你沒有做錯什麼,只是你沒有理解你將從你的代碼中得到的結果。您使用的相機是3D相機,您可以看到在3D空間中移動相機的結果。當您旋轉相機時,平行線通常不會保持平行。您注意到圍繞y軸旋轉時的僞影,但它也出現在您的插圖中,用於X軸旋轉。請注意,對於x軸,左側和右側不平行;左側比右側更接近垂直。

Android canvas對象具有縮放,傾斜,平移和旋轉操作。如果它是您需要的2D操作,則可以完全拋棄對象。

+0

謝謝你的回覆。看起來合乎邏輯,而且我猜想,但它有一個挑戰:當我在(0,0)中繪製沒有旋轉的位圖時,然後將Camera轉換爲(0,0,0),然後旋轉它並用(0,0)中的新矩陣再次繪製位圖,在3D世界中,我們期望旋轉位圖的頂部完全被頂部的不旋轉位圖覆蓋,但結果不是。看起來,即使您翻譯相機到(0,y0,0)並旋轉Y軸,然後在原點(x0,y0)的畫布上繪製一個圓,將在原點(x1,y1)繪製y1 <> y0而不是y1 = y0的圓。 – hasanghaforian

+0

看起來像你期待3D變換行爲像2D,而他們不這樣做。如果這就是你想要的,拋開你正在使用的3D界面,並使用提供2D變換的3D界面。 – eh9

+0

你的回答是真實的,但我不明白你最新評論的邏輯。所以我在這裏問另一個問題。請看這個問題:http://stackoverflow.com/q/13438032/1043882 – hasanghaforian