對於大量數據(例如超過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);
}
你只需做一次找到該值最遠。假設你將數據存儲在一個文件中,你可以編寫一個小工具程序,將上述文件保存到文件中並保存,而不是每次將數據加載到應用程序時都執行此操作。
我已閱讀所有這些單證。我從來沒有找到一個例子,其中用於繪製的float []數組具有很大的座標。在所有示例中它位於-1和1之間。 問題如何執行映射?我應該手動做,並提供float數組的標準化座標的opengl或它可以處理它? – WhiteShark88
我不認爲你需要規範化它,你只需要提供一個包含你的點的FloatBuffer的繪圖方法。因此,您需要將float []數組加載到FloatBuffer中,就像來自APIDemos的示例將int []數組加載到IntBuffer中一樣。然後,您可以將其發送到繪圖方法:gl.glVertexPointer(3,GL10。GL_FLOAT,0,mVertexBuffer); –
我做到了這一點,我無法配置視口,fraustrum或透視視圖,以便能夠看到這些繪製點的問題。我使用GL_POINTS繪製FLoatBuffer。 有什麼建議嗎? 在此先感謝 – WhiteShark88