18

Google 的 Sketchup 是一个不错的、简单的 3D 对象建模器。此外,Google 拥有一个庞大的 3D 对象仓库,因此如果您在这方面不是特别有天赋,您实际上不必自己做太多建模。Google 地球中的许多 3D 建筑都是用 Sketchup 制作的。在 Mathematica 中导入 Sketchup 的 SKP 文件的功能会非常好,但可惜它还没有这样做。

Sketchup的免费版本不会导出为除 KMZ (Google Earth) 和 DAE (Collada) 格式之外的任何其他格式。虽然 MMA 可以读取 KMZ/KML 文件,但它不能读取包含 3D 对象的文件。DAE 文件是压缩的 Collada 文件,这些文件可以通过 MMA 的 Import 读取为 XML。生成的 XML 树与 Collada的定义一样相当复杂,并且获取对象的几何形状绝非易事(我设法从中强制转换模型的坐标集)。

我的问题是:如何在 Mathematica 中以干净的基于多边形的结构转换 SKP 文件?

我更喜欢为 MMA 提供此导入功能的导入转换器,但也欢迎其他路线。明天我将发布我目前使用的相当间接的方法作为答案。

4

4 回答 4

4

我目前遵循的路线涉及多个步骤:

  1. Google 存储库下载 SKP 文件
  2. 在免费版 Sketchup中打开它
  3. 从那里导出为 DAE
  4. 使用免费的 AutoDesk fbx 转换器将其转换为 FBX 格式(在此处的页面深处)
  5. 使用相同的程序,将刚刚创建的 FBX 文件转换为 DXF 或 OBJ
  6. 在 Mathematica 中导入。

结果非常好,尽管您似乎失去了纹理。下图显示了结果。左:原始 Sketchup 模型,中:通过 DXF 转换/导入,右:通过 OBJ 转换/导入。

在此处输入图像描述

显然,您不想经常这样做,对于我正在处理的特定应用程序,我想要一个不太精通计算机的用户也可以处理的解决方案。


更新:

从 10.4 版开始,Mathematica 可以导入和导出 DAE 文件:https ://reference.wolfram.com/language/ref/format/DAE.html

于 2011-06-06T11:15:09.180 回答
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]
于 2012-10-12T18:53:18.750 回答
4

这可能不是您正在寻找的东西,但我维护了一个名为pycollada的 python 库。您可以使用它导出为 Mathematica 的格式。我还一直在研究一个名为meshtool的导入/导出/转换实用程序,您可以编写一个模块,将其导出为Mathematica 的格式。

于 2011-06-05T22:56:34.773 回答
2

答案取决于你想要做什么。如果您只想查看可以导出为 .obj 文件的图像(镶嵌文件,而不是目标代码!)。

试试这个例如:

bunny = Import["http://graphics.stanford.edu/~mdfisher/Data/Meshes/bunny.obj", "OBJ"]

如果您真的想将其作为实体模型使用,您将遇到更困难的时期。实体模型具有相当复杂的数据结构来表示拓扑和几何。例如,您可能能够从模型中取出曲面,但您必须有一些拓扑结构才能说明面使用了曲面的哪个部分。

于 2011-06-06T07:25:18.660 回答