如果我替换 Vuforia iOS 项目的茶壶对象,为什么只看到三角形而不是立方体?

If I replace teapot object of Vuforia iOS project, why only triangle seen instead of Cube?

我下载了示例 Vuforia iOS 项目。我想旋转一个带有纹理的立方体,而不是茶壶。为了创建一个有纹理的立方体,我使用了 blender 并创建了一个 OBJ 文件,其 UV 贴图图像如下:

在搅拌机中,它呈现完美,我可以完美地看到立方体对象及其纹理。

然后我使用 perl 脚本将 OBJ 文件转换为 .h 文件并替换了那个 Teapot.h 文件,还用上面附加的 PNG 替换了茶壶图像。

当我 运行 项目时,可以看到立方体及其纹理,但三角形的每一侧都被切割如下:

我非常想在现有 iOS 项目中创建自定义正方形、具有纹理的立方体,但是,我在检查可行性方面没有取得成功。

NOTE: My project is already developed with lots of frameworks and libraries and in one screen, I need to integrate this function.

我可以通过 add-on 到 Blender 然后直接从 Blender 导出 .h 文件来实现它。导出前无需进行三角测量,因为 Unity 已经为我们进行了三角测量。

  • here 下载 add-on。有关于如何将其添加到 Blender 的完整指南。
  • 在 Blender 中准备您想要的 3D 对象。查看 this 教程,其中解释了如何使用 Blender 并制作一个周围有纹理的简单 3D 对象。

  • 获得所需模型后,转到 File > Export > Vuforia OpenGL C Include,如下图所示。将 .h 文件保存在某个位置

  • 在 Vuforia iOS 示例项目中,以相同的方式添加此 .h 文件和 UV-mapping 图像(我们用来渲染我们的对象)Teapot.h 及其 UV-mapping 图片。

  • 导入头文件。

  • 更换茶壶:

替换

glVertexAttribPointer(vertexHandle, 3, GL_FLOAT, GL_FALSE, 0, (const GLvoid*)teapotVertices);
glVertexAttribPointer(normalHandle, 3, GL_FLOAT, GL_FALSE, 0, (const GLvoid*)teapotNormals);
glVertexAttribPointer(textureCoordHandle, 2, GL_FLOAT, GL_FALSE, 0, (const GLvoid*)teapotTexCoords);

BlenderExportedObject object = rectObject;

glVertexAttribPointer(vertexHandle, 3, GL_FLOAT, GL_FALSE, 0, (const GLvoid*)object.vertices);
glVertexAttribPointer(normalHandle, 3, GL_FLOAT, GL_FALSE, 0, (const GLvoid*)object.normals);
glVertexAttribPointer(textureCoordHandle, 2, GL_FLOAT, GL_FALSE, 0, (const GLvoid*)object.texCoords);

其中 rectObject 是对象名称。在我的例子中,我的 Blender 对象名称是 rect 所以它在 .h 文件中创建了 rectObject 名称。检查您的 .h 文件以找到该名称。

  • 绘制元素:

替换

glDrawElements(GL_TRIANGLES, NUM_TEAPOT_OBJECT_INDEX, GL_UNSIGNED_SHORT, (const GLvoid*)teapotIndices);

glDrawElements(GL_TRIANGLES, NUM_RECT_OBJECT_INDEX, GL_UNSIGNED_SHORT, (const GLvoid*)object.indices);

参考 .h 文件找到 NUM_RECT_OBJECT_INDEX

  • 就是这样。它现在应该可以完美地渲染任何复杂的 3D 对象。