Wolfram mathematica 如何从Mathematica中的3DS/OBJ导入形成BSpline函数

Wolfram mathematica 如何从Mathematica中的3DS/OBJ导入形成BSpline函数,wolfram-mathematica,bspline,Wolfram Mathematica,Bspline,下面是一个三维几何体示例 dat=Import["ExampleData/747.3ds.gz", ImageSize -> Medium] 现在,如果想要为这个3D几何体获得BSplineFunction,最简单的方法是什么 我可以使用以下命令查看Mathematica中的零件 parts = Length[(dat // First // Last)]; 这里是提取后的3D点 ListPointPlot3D[Flatten[Map[((dat // First // Last)[[

下面是一个三维几何体示例

dat=Import["ExampleData/747.3ds.gz", ImageSize -> Medium]
现在,如果想要为这个3D几何体获得BSplineFunction,最简单的方法是什么

我可以使用以下命令查看Mathematica中的零件

parts = Length[(dat // First // Last)];
这里是提取后的3D点

ListPointPlot3D[Flatten[Map[((dat // First // Last)[[#]] /. 
  GraphicsComplex[a_, b_] -> List[a]) &, Range[parts]], 1]]
我希望有一个通用的方法,使我们可以形成一个BSpline函数从任何三维图形复杂。 我想一般的方法可以将Mathematica 3D表示转换为连续的BSplines表示

现在我们将根据belisarius给出的示例进行详细说明

v={{0,0,0},{2,0,0},{2,2,0},{0,2,0},{1,1,2}};
i={{1,2,5},{2,3,5},{3,4,5},{4,1,5}};
Graphics3D[{Opacity[.5],GraphicsComplex[v,Polygon[i]]}]

对于本例,我们可以简单地形成BSpline曲面的输入

dat = Table[Map[v[[#]] &, i[[j]]], {j, 1, Length[i]}];

现在让我们看看如果我们考虑底层顶点,就会出现表面。

Show[
     (* Vertices *)
     ListPointPlot3D[v,PlotStyle->{{Black,PointSize[.03]}}],
     (* The 3D solid *)
     Graphics3D[{Opacity[.4],GraphicsComplex[v,Polygon[i]]}],
     (* The BSpline surface *)
     Graphics3D[{Opacity[.9],FaceForm[Red,Yellow],
                 BSplineSurface[dat, SplineDegree-> {1,2},SplineClosed->{True,False}]}
                ],
     Boxed-> False,Axes-> None
    ]

一旦这个曲面形成,我认为以某种方式制作BSplineFunction是可能的。但是我得到的和上面的完全不同

func = BSplineFunction[dat, SplineDegree -> {1, 2},SplineClosed -> {True, False}];
Plot3D[func[x, y], {x, 0, 1}, {y, 0, 1}, Mesh -> None,PlotRange -> All]


所以我在这里犯了一些概念上的错误吗?

我认为你的问题需要进一步澄清

.3DS主要是多边形集,如下所示:

v = {{0, 0, 0}, {2, 0, 0}, {2, 2, 0}, {0, 2, 0}, {1, 1, 2}};
i = {{1, 2, 5}, {2, 3, 5}, {3, 4, 5}, {4, 1, 5}};
Graphics3D[{Opacity[.5], GraphicsComplex[v, Polygon[i]]}]

因此,如何获得样条曲线曲面来对此进行建模并不明显

也许你可以用这个例子详细说明一下

dat = Table[Map[v[[#]] &, i[[j]]], {j, 1, Length[i]}];

我认为你的问题需要进一步澄清

.3DS主要是多边形集,如下所示:

v = {{0, 0, 0}, {2, 0, 0}, {2, 2, 0}, {0, 2, 0}, {1, 1, 2}};
i = {{1, 2, 5}, {2, 3, 5}, {3, 4, 5}, {4, 1, 5}};
Graphics3D[{Opacity[.5], GraphicsComplex[v, Polygon[i]]}]

因此,如何获得样条曲线曲面来对此进行建模并不明显

也许你可以用这个例子详细说明一下

dat = Table[Map[v[[#]] &, i[[j]]], {j, 1, Length[i]}];

次要细节:样条曲线有点扭曲,这是因为您选择了
splinegree
。对于金字塔的情况,我选择{2,1}而不是{1,2}。 这将给你一个圆锥体,而不是你现在拥有的软冰圆锥体。当然,这一切都是相当武断的,美在旁观者的眼中

现在,请回答以下问题:
BSplineFunction
的三维绘图为什么与具有相同控制点的
BSplineSurface
Graphics3D
结果不同。问题在于,假设
BSplineFunction
中的两个参数对应于笛卡尔坐标系的x和y。嗯,他们没有。这些参数是曲面内部参数化描述的一部分,在曲面内部参数化描述中,更改这两个参数将生成一组三维点,因此您必须在此处使用
ParametericPlot3D

因此,如果将
Plot3D
更改为
ParametricPlot3D
,您将看到一切正常


我希望这能回答你们最后的问题。这是否也回答了如何将基于三维多边形的模型转换为基于样条线的模型的问题?您面临的一个问题是样条曲线作为一种插值函数通常不会通过其控制点。

次要细节:样条曲线有点扭曲,这是因为您选择了
样条曲线。对于金字塔的情况,我选择{2,1}而不是{1,2}。
这将给你一个圆锥体,而不是你现在拥有的软冰圆锥体。当然,这一切都是相当武断的,美在旁观者的眼中

现在,请回答以下问题:
BSplineFunction
的三维绘图为什么与具有相同控制点的
BSplineSurface
Graphics3D
结果不同。问题在于,假设
BSplineFunction
中的两个参数对应于笛卡尔坐标系的x和y。嗯,他们没有。这些参数是曲面内部参数化描述的一部分,在曲面内部参数化描述中,更改这两个参数将生成一组三维点,因此您必须在此处使用
ParametericPlot3D

因此,如果将
Plot3D
更改为
ParametricPlot3D
,您将看到一切正常


我希望这能回答你们最后的问题。这是否也回答了如何将基于三维多边形的模型转换为基于样条线的模型的问题?您面临的一个问题是样条曲线作为一种插值函数通常不会通过其控制点。

在我忘记之前:柏拉图狂人,欢迎使用StackOverflow!别忘了为下面你喜欢的答案投票,如果其中一个答案让你满意,请用答案旁边的复选标记接受。你可以随时改变你的选择。@Sjoerd实际上你是对的!答案仍然不在那里。我们仍然没有找到如何为更复杂的3D导入(如Boing模型)形成这种类型的BSpline!别忘了为下面你喜欢的答案投票,如果其中一个答案让你满意,请用答案旁边的复选标记接受。你可以随时改变你的选择。@Sjoerd实际上你是对的!答案仍然不在那里。我们仍然没有找到如何为更复杂的3D导入(如Boing模型)形成这种类型的BSpline。我想这些野兽的名字是凯特穆尔·罗姆或者类似的名字,我很抱歉!!!我在匆忙中犯了错误。我总是使用ParametericPlot3D进行BSpline可视化。原因可能是昨晚没睡,今天早上编辑了这篇文章。无论如何谢谢你!!不过,我现在将尝试对波音3DS模型应用相同的技巧。这种情况下的GraphicsComplex似乎比我们到目前为止玩的金字塔更复杂。插值属性也有类似的构造。我想这些野兽的名字是凯特穆尔·罗姆或者类似的名字,我很抱歉!!!我在匆忙中犯了错误。我总是使用ParametericPlot3D进行BSpline可视化。原因可能是昨晚没睡,今天早上编辑了这篇文章。无论如何谢谢你!!不过,我现在将尝试对波音3DS模型应用相同的技巧。这种情况下的图形复杂度似乎更高