2011-11-30 110 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); 
}  

你只需做一次找到该值最远。假设你将数据存储在一个文件中,你可以编写一个小工具程序,将上述文件保存到文件中并保存,而不是每次将数据加载到应用程序时都执行此操作。