在 OpenGL 中使用 Blender/SketchUp 模型

Posted

技术标签:

【中文标题】在 OpenGL 中使用 Blender/SketchUp 模型【英文标题】:Using Blender/SketchUp Models in OpenGL 【发布时间】:2010-12-21 22:18:18 【问题描述】:

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

我的意思是我的模特脸被雕刻成三角形。您可以在this image(转载如下)中看到我的曲线变成了 24 个三角形。我想知道每个三角形使用什么纹理坐标。

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

【问题讨论】:

您能否详细说明“我也想轻松地将我的纹理文件分割成纹理坐标”是什么意思 没问题!编辑了我原来的帖子。 图片规则问题,所以我冒昧地添加了你的问题。 【参考方案1】:

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

【讨论】:

这看起来像是一种更简单的表示相同数据的方法。今晚我会研究一下 OBJ 格式。 我想让您知道 OBJ(和相应的 MTL 文件)运行良好。非常感谢!【参考方案2】:

如果二进制格式不吓到你,我建议编写一个 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()

【讨论】:

【参考方案3】:

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

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

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

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

【讨论】:

我想让你知道 OBJ 文件工作得很好。非常感谢!【参考方案4】:

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

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

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

【讨论】:

我以前做过网络应用;我知道不做我自己的 XML 解析。它将通过图书馆。【参考方案5】:

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

【讨论】:

这很有趣!我去看看。 @mkenyon Github 上可能还有很多开源库。【参考方案6】:

你应该看看:

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

【讨论】:

以上是关于在 OpenGL 中使用 Blender/SketchUp 模型的主要内容,如果未能解决你的问题,请参考以下文章

在 OpenGL 的正交投影中使用纹理

在使用 QOpenGLFunctions 时将 OpenGL 功能封装在 C++ 对象中

我可以在 OpenGL 中使用不同的多 GPU 吗?

在 Visual Studio 2013 Express 中使用 OpenGL

使用openGL在c ++中绘制圆

如何在 C++ 中获取 OpenGL 使用的总内存(以字节为单位)?