在OpenGL中使用Blender / SketchUp模型

时间:2009-12-01 07:44:30

标签: opengl blender sketchup

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

由此,我的意思是我的模型面被雕刻成三角形。您可以在this image(下面再现)中看到我的曲线变为24个三角形。我想知道每个三角形使用什么纹理坐标。

Polygonized curved 3D object

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

6 个答案:

答案 0 :(得分:12)

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

答案 1 :(得分: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()

答案 2 :(得分:2)

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

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

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

话虽如此,如果您的唯一目标是使用顶点,法线和纹理坐标加载一个简单的几何体,那么使用.obj文件格式可能会更快。

答案 3 :(得分:1)

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

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

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

答案 4 :(得分:1)

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

答案 5 :(得分: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