2011-11-30 139 views
1

我做了很多搜索,沒有解決我的問題。我對android和3D編程都很陌生。我正在開發一個Android項目,我需要使用opengl在Android設備上繪製一個3d對象。對於每個像素,我的距離值在200到9000之間,需要將其映射爲Z座標。該對象是320x240。android OpenGL ES座標映射

的問題是:

  • 如何從(X,Y,Z)映射到OpenGL ES的座標系?我創建了一個頂點數組,其值爲{50f,50f,400f,50f,51f,290f,...}。每個像素表示爲3個浮點數(x,y,z)。
  • 如何在android上使用opengl繪製這個頂點數組?
  • 是否可以使用OpenGl ES繪製320 * 240像素?

回答

0

檢出Android SDK附帶的APIDemos中的GLSurfaceView活動。這將給你一個關於Android如何通過OpenGL ES處理渲染的基本入門。它位於android-sdk/samples/android-10/ApiDemos中。確保你已經在給定的API級別下載了'Samples for SDK'。

這裏有一對夫婦的資源,讓你開始,以及:

Android Dev Blog on GLSurfaceView

Instructions on OpenGLES

Android Development Documentation on OpenGL

希望有所幫助。

+0

我已閱讀所有這些單證。我從來沒有找到一個例子,其中用於繪製的float []數組具有很大的座標。在所有示例中它位於-1和1之間。 問題如何執行映射?我應該手動做,並提供float數組的標準化座標的opengl或它可以處理它? – WhiteShark88

+0

我不認爲你需要規範化它,你只需要提供一個包含你的點的FloatBuffer的繪圖方法。因此,您需要將float []數組加載到FloatBuffer中,就像來自APIDemos的示例將int []數組加載到IntBuffer中一樣。然後,您可以將其發送到繪圖方法:gl.glVertexPointer(3,GL10。GL_FLOAT,0,mVertexBuffer); –

+0

我做到了這一點,我無法配置視口,fraustrum或透視視圖,以便能夠看到這些繪製點的問題。我使用GL_POINTS繪製FLoatBuffer。 有什麼建議嗎? 在此先感謝 – WhiteShark88

1

對於大量數據(例如超過10.0f的任何東西,就像它的設計方式),OpenGL並不能很好地工作。將座標轉換爲-1和1之間(即標準化)會比試圖使openGL使用50f或290f的座標更好。

座標歸一化到-1和1之間的原因是因爲模型座標只能相對於彼此而言並不表示它們在特定遊戲/應用程序中的實際尺寸。該模型可以用於許多不同座標系統的遊戲/應用程序,因此您希望所有的模型座標都採用標準化的標準格式,以便程序員可以用自己的方式進行解釋。

校準,您遍歷所有的座標,從0即

float maxValueX = 0; 
float maxValueY = 0; 
float maxValueZ = 0; 

// find the max value of x, y and z 
for(int i=0;i<coordinates.length'i++){ 
    maxValueX = Math.max(Math.abs(coordinates[i].getX()), maxValueX); 
    maxValueY = Math.max(Math.abs(coordinates[i].getY()), maxValueY); 
    maxValueZ = Math.max(Math.abs(coordinates[i].getZ()), maxValueZ); 
} 

// convert all the coordinates to be between -1 and 1 
for(int i=0;i<coordinates.length'i++){ 
    Vector3f coordinate = coordinates[i]; 
    coordinate.setX(coordinate.getX()/maxValueX); 
    coordinate.setY(coordinate.getY()/maxValueY); 
    coordinate.setZ(coordinate.getZ()/maxValueZ); 
}  

你只需做一次找到該值最遠。假設你將數據存儲在一個文件中,你可以編寫一個小工具程序,將上述文件保存到文件中並保存,而不是每次將數據加載到應用程序時都執行此操作。