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

时间:2019-06-21 12:15:28

标签: ios unity3d blender vuforia

我下载了示例Vuforia iOS项目。我要代替茶壶,而要旋转具有纹理的多维数据集。为了创建具有纹理的立方体,我使用了Blender并使用其UV映射图像创建了一个OBJ文件,如下所示:

enter image description here

在Blender中,它呈现完美,我可以看到具有纹理的立方体对象。

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

在我运行项目时,可以看到具有其纹理的立方体,但每个边都切成三角形,如下所示:

enter image description here

我迫切希望在现有的iOS项目中创建自定义正方形,具有纹理的立方体,但是我在检查可行性方面没有获得成功。

  

注意:我的项目已经开发了很多框架,并且   库,并且在一个屏幕中,我需要集成此功能。

1 个答案:

答案 0 :(得分:3)

我可以通过在Blender中添加附件然后直接从Blender中导出.h文件来实现。无需进行三角剖分,因为Unity已经对我们进行了三角剖分。

  • here下载附件。有关如何将其添加到Blender的完整指南。
  • 在Blender中准备所需的3D对象。查看this教程,该教程说明了如何使用Blender并制作一个带有纹理的简单3D对象。

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

enter image description here

  • 在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,因此它在rectObject文件中创建了.h名称。检查您的.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对象。