2011-07-28 27 views
0

美好的一天,圍繞X軸旋轉的畫布上繪製位圖的問題

我有繪製圖像的奇怪問題。代碼和圖片多說話。

mCamera.save(); 
mCamera.rotateX(rotateX); 
mCamera.getMatrix(mMatrix); 
mCamera.restore(); 

canvas.save(); 
canvas.setMatrix(mMatrix); 

// here I draw images 
... 

canvas.restore(); 

和結果在圖像下面。第一張照片的角度爲0度,第二張照片的角度爲45度,最後還有更多東西。它取決於我想繪製的區域的大小(位圖的數量)。我注意到,當我繪製整個符合畫布邊界的位圖時,它可以正常工作。但問題是,主要是當我繪製圖像的東西,如(所以有部分畫布外)

canvas.drawBitmap(image, -100, -100, null) 

和圖像(嗯,因爲我是新來的,我不能直接發表圖片...)

TTP://locus.asamm.cz/data/_temp/1311873666794.png

http://locus.asamm.cz/data/_temp/1311873695945.png

http://locus.asamm.cz/data/_temp/1311873782054.png

所以問題是,如果療法e是任何工作解決方案或至少任何提示。此外,如果有經驗的人可以判斷使用OpenGL進行繪圖是否可以提供幫助,如果可以,請指向任何信息源,以幫助我繪製變化很大的位圖(它是地圖應用程序,因此用戶可以隨地圖移動),因爲我仍然找不到任何簡單明瞭的信息來源。

非常感謝

回答

0

這是2D繪圖API的限制。要做到真正的3D,你應該使用OpenGL。

+0

嗯我很擔心我會收到這個答案。所以也是第二個問題。任何提示樣本解決方案,應該可以幫助我更好地理解如何在OpenGL中顯示動態加載的位圖?我知道有很多教程,但每個節目只顯示如何顯示已經預載的位圖或一些矢量。謝謝 –

+0

接受這個答案之後再過一年積極發展。似乎常見的「畫布」方式對於此任務來說不夠強大,並且使用OpenGL是唯一的解決方案。謝謝你的幫助 –

0

我希望你試圖產生一個谷歌地圖傾斜/旋轉效果,我已經成功完成谷歌地圖,因爲他們不認爲我們需要更新;-),我需要它爲我的應用程序,即使你正在使用你自己的瓷磚,它基本上是一樣的東西。

有幫助的一件事是意識到Camera Matrix的旋轉在左上角執行。

因此,您應該轉換到適當的位置(取決於旋轉軸和您的預期結果),然後返回,例如...在閱讀文檔之前,您獲得的效果與我的效果非常相似,出。

camera.save(); 
    camera.rotateX(tilt); // tilt forward or backward 
    camera.rotateY(0); 
    camera.rotateZ(angle); // Rotate around Z access (similar to canvas.rotate)         

    camera.getMatrix(cameraMatrix); 

    // This moves the center of the view into the upper left corner (0,0) 
    // which is necessary because Matrix always uses 0,0, as it's transform point 
    // use the center of the canvas, or the bottom center dependent on your results 
    cameraMatrix.preTranslate(-centerX, -centerY); 

    // NOTE: Camera Rotations logically happen here when the canvas has the matrix applied 
    // This happens after the camera rotations are applied, moving the view back to 
    // where it belongs, allowing us to rotate around the center or any point we choose 

    // Move it back after the rotations are applied 
    cameraMatrix.postTranslate(centerX, centerY); 

camera.restore(); 

canvas.concat(cameraMatrix); 

其他的事情做的是特大型容器,所以你沒有空的空間(或者至少限制的話)你的後傾/旋轉操作,你可以做到這一點通過計算所需的超大中,你的顯示器的對角線適用於基本旋轉,+如果你正在使用它,則基於傾斜的百分比。

玩pre/postTranslate可以給你一些有趣的結果。

至於運動,我真的不知道爲什麼你這樣做,大概平移,但只要在畫布上是越來越充滿它不應該的問題

更新

這裏是位圖我如何超大畫布,我試圖使用LayoutParams來做到這一點,但沒有太多的運氣,所以測量是我的方式。

@Override 
public void onMeasure(int widthMeasureSpec, int heightMeasureSpec) 
{ 
    if (!isInEditMode()) 
     super.onMeasure(View.MeasureSpec.makeMeasureSpec(scaledDimensionsW, 
     View.MeasureSpec.EXACTLY), 
     View.MeasureSpec.makeMeasureSpec(scaledDimensionsH, 
     View.MeasureSpec.EXACTLY)); 
    else 
    super.onMeasure(widthMeasureSpec, heightMeasureSpec); 
} 
+0

謝謝你的迴應。通過你的代碼,我可以看到我所做的一切都是一樣的(或幾乎相同)。正如你可以在我的第一篇文章中看到的附加圖像,我正在以正確的方式(圍繞中心)旋轉畫布。超大尺寸也完成了。例如,當屏幕爲800x480時,我將地圖繪製的區域設置爲2000x2000,並將有效的平移應用於矩陣以將地圖放置在正確的位置。即使這樣,圖像也非常相似......在顯示屏上顯示無效行。隨着羅曼的閹割,我不得不使用一些OpenGL方法,但經過半天的搜索,我仍然不知道如何簡單地將畫布更改爲OpenGL –

+0

那麼它對我來說工作正常,我沒有真正的問題,我將傾斜度限制在45度以下,因爲我不需要更多,但是我已經升至60度作爲測試並且仍然沒有問題。你如何超大畫布?你還在做前期翻譯? – Idistic

+0

嗯該死......是的我使用完全相同的機制。但是,您使用centerX,Y的preTranslate,我使用preTranslate來定製自定義大小。這個大小還定義了瓷磚繪製的區域。嗯,但看起來它必須以某種方式工作。你可以告訴你是否直接改變畫布的大小(如果這是可能的話)?因爲我沒有。我只是「對我的地圖說」,畫布尺寸是2000x2000(即使它只有480x800),我只是畫「這個」(面積2000x2000)。所以我preTranslate(-1000,-1000)和postTranslate(240,400)。當我只圍繞Z旋轉時,它完美地工作。 X周圍引起麻煩。 –