在Mathematica中导入Google Sketchup模型

18
Google Sketchup是一款不错的简单三维物体建模软件。此外,谷歌有一个巨大的三维物体库,如果你对这方面不太擅长,实际上你不需要做太多的建模工作。在Google Earth中的许多三维建筑都是用Sketchup制作的。将Sketchup的SKP文件导入到Mathematica中的功能非常好,但遗憾的是,它还没有这样做。
Sketchup的免费版本只能导出KMZ(Google Earth)和DAE(Collada)格式,无法导出其他格式。尽管MMA可以读取KMZ / KML文件,但它不会读取包含3D对象的文件。DAE文件是压缩的Collada文件,可以通过MMA的导入函数读取为XML格式。结果XML树相当复杂,Collada的定义也很复杂,并且获取对象的几何信息远非易事(我成功地从中获取了模型的坐标集)。
我的问题是:如何在Mathematica中将SKP文件转换为干净的基于多边形结构?
我希望有一个导入转换器可以为MMA提供此导入功能,但也欢迎其他方法。我将在明天发布我目前正在使用的相当间接的方法的答案。

从http://www.designcad.com.au/Sketchup/export_models.pdf:存储模型几何形状的这种基本差异会在CAD环境中限制模型的使用。 - Dr. belisarius
@belisarius 您的第一条评论:这对我来说并不是真正的问题。对于我的应用程序来说,拥有一个非结构化的多边形列表是可以接受的。您的第二条评论:看起来很有前途,我正在等待注册确认,以便我可以下载插件。如果它有效,我建议您将其发布为答案以获得信用。 - Sjoerd C. de Vries
@Sjoerd 如果链接有效,请自己写一个答案,因为我只是进行了谷歌搜索。祝你好运! - Dr. belisarius
@belisarius 我尝试了OBJexporter,总体来说它运行得还不错,但它会将对应的纹理文件引用插入到.obj文件中,而mma导入器无法处理这些引用。因此,在导入后,显示会显示一个粉色的框,表示存在几个错误。不过,3D几何图形似乎是正常的。 - Sjoerd C. de Vries
你可以建议支持方应该包括Collada导入/导出支持,特别是考虑到这是许多程序支持的开放格式,尤其是因为SketchUp的免费版本可以导出它... - Szabolcs
显示剩余4条评论
4个回答

4

也许不完全符合您的要求,但我维护着一个名为pycollada的Python库。 您可以使用它来导出到Mathematica的格式。 我还在开发一个名为meshtool的导入/导出/转换工具,您可以编写一个模块将其导出到Mathematica的格式。


OBJ和Three.js在我的清单上,但现在它只支持collada格式的导入和导出。 - jterrace
谢谢!我不是很擅长Python,但或许有精通Mathematica和Python的人可以介入这里? - Sjoerd C. de Vries
嗨Sjoerd,这可能有点晚了,但也许可以看看Pythonika。我以前用它将一些我在Python中拥有的串行IO东西链接到Mathematica(在我意识到Mathematica有一个串行IO包之前)。如果你需要具体信息,请给我发电子邮件,我会看看我能找到什么。 - Keshav Saharia

4
我目前采用的路线包括以下步骤:
  1. Google仓库下载SKP文件
  2. Sketchup免费版中打开它
  3. 从中导出DAE格式
  4. 使用免费的AutoDesk fbx转换器(在此处页面底部)将其转换为FBX格式
  5. 使用相同的程序,将刚创建的FBX文件转换为DXF或OBJ格式
  6. 在Mathematica中导入。
结果非常好,但似乎会失去纹理。下图显示了结果。左:原始的Sketchup模型,中:通过DXF转换/导入,右:通过OBJ转换/导入。

enter image description here

显然,您不希望经常这样做,并且对于我正在处理的特定应用程序,我希望用户也能够轻松操作。

更新:

从版本10.4开始,Mathematica具有导入和导出DAE文件的功能:https://reference.wolfram.com/language/ref/format/DAE.html

4

以下是成功将由SketchUp 8.0的免费版本生成的非常简单的.dae文件导入Mathematica 8的代码。该代码未检测或处理变换,仅查看坐标和三角形,因此请不要期望过多。

data = Import[SystemDialogInput["FileOpen"], "XML"]; 

points = Map[( Partition[ReadList[StringToStream[#[[1]] ], Number], 
3]) &, (Map[Part[#, 3] &, (Partition[
Cases[data, XMLElement["float_array", _, _], Infinity], 
2][[All, 1]])] ) ];

triangles = Map[Partition[1 + ReadList[StringToStream[#[[1]]], Number],3] &, 
Map[Part[#, 3, 2, 3]&, 
Cases[data, XMLElement["triangles", _, _], Infinity]]];

Graphics3D[Map[GraphicsComplex[#[[1]], Polygon[#[[2]]]] &, 
Transpose[{points, triangles}]], Boxed -> False]

2
答案取决于您想要做什么。如果你只想看到图片,你可以将其导出为 .obj 文件(细分文件,不是对象代码!)。
例如,尝试这个:
bunny = Import["http://graphics.stanford.edu/~mdfisher/Data/Meshes/bunny.obj", "OBJ"]

如果您想要将其作为实体模型进行操作,那么会更加困难。实体模型具有相当复杂的数据结构,用于表示拓扑和几何形状。例如,您可能能够从模型中获取表面,但是您必须具备一些拓扑知识来确定表面的哪个部分被面使用。


问题是,正如我在问题中所述,将Sketchup的SKP文件转换为mma可以导入的格式。我知道它可以导入.obj文件。我已经使用过了,这不是问题。Sketchup的免费版本无法导出为obj。 - Sjoerd C. de Vries
@sjoerd-c-de-vries Sketchup可以导出COLLADA(dae)格式。您可以将其导入[blender](http://www.blender.org/),然后再导出为OBJ格式。虽然有些麻烦,但应该可以使用。 - jterrace
@jterrace 我知道DAE导出并在问题中提到了这一点。 - Sjoerd C. de Vries

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接