对于大量数据(例如超过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