13

我正在使用 OpenGL 制作渲染器。我在 Blender / Sketchup 中有纹理模型(我可以轻松地在两者之间进行交换),我希望能够将这些文件导出到我的渲染器中。我最初的想法是简单地导出原始面并渲染这些三角形,但我也想轻松地将我的纹理文件分割成纹理坐标。

我的意思是我的模特脸被雕刻成三角形。你可以在这张图片中看到(复制如下)我的曲线变成了 24 个三角形。我想知道每个三角形使用什么纹理坐标。

多边形弯曲 3D 对象

DAE 文件会是最简单的方法吗?我一直在阅读格式的规范,它看起来很容易。我想我可以解析 XML 并忠实地在 OpenGL 中重新创建模型。我想知道是否有更简单的方法(即不重新发明轮子的方法)。

4

6 回答 6

12

如果您对解析 .dae 格式感到满意,请务必使用它。但是,如果您只对导出带纹理的三角形网格感兴趣,我会考虑使用更易于解析的.obj 格式。据我所知,Sketchup 和 Blender 都可以导出这种格式。

于 2009-12-01T10:14:27.493 回答
5

如果二进制格式不吓到你,我建议编写一个 Blender & Sketchup 插件并将预先烘焙的几何图形导出到打包的顶点数组中。

这种方法的美妙之处在于您的应用程序中没有解析或类型转换。一切都准备好以简单的连续内存副本发送到 GPU。非常适合静态几何。

一个精简的搅拌机导出器看起来像这样:


#!BPY
import bpy, struct
from Blender import *

self.fh = open("MyFileName", "w")
m = bpy.data.meshes["MyMeshName"]
faces = m.faces
for face in faces:
    for (vertex, uv) in zip(face.verts, face.uv):
        self.fh.write(struct.pack('<fff', *vertex.co)) # coords
        self.fh.write(struct.pack('<fff', *vertex.no)) # normals
        self.fh.write(struct.pack('<ff',  uv.x, uv.y)) # uvs

self.fh.close()
于 2009-12-09T23:02:39.297 回答
2

如果您想解析.dae文件,我建议您查看Collada解析器。 .dae实际上是 Collada 文件的扩展,这是Khronos 小组(OpenGL 的维护者)为 3D 数据交换提供单一统一文件格式的最新成果。

至于现有的解析器,这是我遇到的:

  • collada-dom,参考实现。顾名思义,它只是 XML 树的抽象。
  • FCollada,一个更好的抽象。然而,这个项目已经死了快两年了,根据我收集到的信息,我们不太可能在未来看到任何更新。
  • OpenCollada,最近的一项新工作。没有尝试过,但它背后有一个活跃的社区。

话虽如此,如果您的唯一目标是加载带有顶点、法线和纹理坐标的简单几何图形,则使用.obj文件格式可能是一种更快的方法。

于 2009-12-01T22:33:02.693 回答
1

还有:Lib3DS - http://www.lib3ds.org/ LibOBJ(不让我发布链接)

于 2009-12-11T00:29:53.543 回答
1

建模程序(例如 Blender 或 Sketchup)使用的任何体面的文件格式都将包含重新创建您看到的几何图形所需的所有信息。这应该包括几何类型(例如三角形带、单个三角形等)、几何的顶点和法线、使用的材料属性,以及使用的纹理以及适当的纹理坐标。如果潜在的文件格式缺少任何内容,请选择另一种。

如果您认为解析 XML 很简单,那么我希望您计划使用现有的库来执行此操作,例如 expat、Xerces 或其他一些特定于语言的实现。

在考虑导入/导出时,首先尝试找到一个可以为您处理导入的开源库,并使数据以合理的格式提供给您的程序。如果这不可用,并且您必须编写自己的导入程序,那么请尝试找到适合您需要的简单 ASCII(不是基于 XML )或二进制格式。PLY 可能是合适的。只有作为最后的手段,我才建议尝试为基于 XML 的格式实现导入器。

于 2009-12-01T10:11:59.063 回答
0

你应该看看:

http://sketchup.google.com/community/developers.html

Sketchup 团队免费提供了一个 C++ COM 服务器。使用它,您可以访问有关 .skp 文件的大量信息。

您应该能够使用此 COM 服务器为您的应用程序编写一个 .skp 导入器。

如果可以,您应该尝试获取 .tlb 文件。这将使您可以访问智能指针,这将简化您的导入器(COM 客户端)

我使用了版本 6 SDK(其中包括 tlb 文件)。当前版本的 SDK 似乎不包含此文件。

有人在开发者论坛上发布了解决方案(针对丢失的 tlb 文件): http ://groups.google.com/group/su-sdk-fileshare/topics

于 2009-12-07T22:48:11.717 回答