有没有一种方法将3D模型导入Android?

58

能否将简单的3D模型(例如在3DS MAX中)创建并导入到Android中?

6个回答

42

这是我目前的进展:

  • 我使用了Google的APIDemos作为起点 - 其中有旋转的立方体,每个都由两个数组指定:顶点和索引。
  • 我使用Blender构建了我的模型,并将其导出为OFF文件 - 这是一个文本文件,列出了所有顶点,然后以这些顶点为索引来定义面(索引几何)。
  • 然后我创建了一个简单的C ++应用程序,该应用程序接受OFF文件并将其写入两个XML文件中,这些XML文件包含数组(一个用于顶点,一个用于索引)。
  • 然后将这些XML文件复制到res/values中,通过以下方式可以将它们所包含的数据分配给数组:
    int vertices[] = context.getResources().getIntArray(R.array.vertices);
  • 我还需要手动更改要在此处绘制的面数:gl.glDrawElements(GL10.GL_TRIANGLES, 212*6, GL10.GL_UNSIGNED_SHORT, mIndexBuffer); - 您可以在OFF文件的顶部找到该数字(在此示例中为212)

在此处您可以找到我的项目页面,该页面使用了这种解决方案: Github项目 > vsiogap3d


13

你可以将它导出为 ASE 格式。 从 ASE 格式,你可以手动或编程方式将其转换为你的代码。 在 Android 中,你需要使用 vertex 表示顶点数组,使用 faces 表示索引。 别忘了你还需要设置

gl.glFrontFace(GL10.GL_CCW);

因为3ds max默认是逆时针方向。


1
谢谢,这非常接近我所做的 - 我使用了OFF和Blonder。 - Maciej Gryka

7
应该是可行的。您可以将文件作为数据文件与您的程序一起使用(并且作为这样的文件,它将被推送到模拟器并打包安装到实际设备上)。然后,您可以使用Android和GLES库在Java中编写模型加载器和查看器来显示模型。
不过,关于这个特定资源的信息可能有限。3ds是一种专有格式,因此第三方加载器供应相对较少,而且大多数是逆向工程的。其他格式(如Blender或Milkshape)更加开放,您应该可以在Java中轻松找到编写其加载器的详细信息。

7

你尝试过为安卓开发的min3d吗?它支持3ds max、obj和md2模型。


这个库的好教程:http://www.mat-d.com/site/tutorial-load-a-3d-obj-model-with-min3d-for-android/ - Ievgen

4

关于Android方面我不确定,但一般而言,您需要在3DS Max中编写脚本,手动从模型中书写所需的格式。

至于是否存在适用于Android的脚本,我不知道。


4
您还可以使用3D对象转换器将3DS MAX模型转换为文本\XML格式或C代码。
请注意,该工具不是免费的,您可以尝试30天的试用期。 'C'代码和XML转换器都可用。
其中,http://web.t-online.hu/karpo/是该工具的下载链接。
以下是“c” OpenGL输出示例:
glDisable(GL_TEXTURE_2D);
glEnable(GL_LIGHTING);
glEnable(GL_NORMALIZE);

GLfloat Material_1[] = { 0.498039f, 0.498039f, 0.498039f, 1.000000f };

glBegin(GL_TRIANGLES);

  glMaterialfv(GL_FRONT,GL_DIFFUSE,Material_1
  glNormal3d(0.452267,0.000000,0.891883);
  glVertex3d(5.108326,1.737655,2.650969);
  glVertex3d(9.124107,-0.002484,0.614596);
  glVertex3d(9.124107,4.039649,0.614596);

glEnd();

或者直接输出 'c' 语言结果:
Point3 Object1_vertex[] = {
       {5.108326,1.737655,2.650969},
       {9.124107,-0.002484,0.614596},
       {9.124107,4.039649,0.614596}};
long Object1_face[] = {
       3,0,1,2,
       3,3,4,5
       3,6,3,5};

您可以将这些对象集合迁移到您的Java代码中。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接