1

这是一个示例 3D 几何。

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]]

我希望有一个通用的方法,这样我们就可以从任何 3D 图形复合体中形成一个 BSpline 函数。我想一般方法将能够将 Mathematica 3D 表示转换为连续 BSplines 表示。

现在我们将根据贝利撒留给出的例子进行详细说明。

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]

在此处输入图像描述

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

4

2 回答 2

2

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

.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]]}]

在此处输入图像描述

因此,如何让样条曲面对此建模并不明显。

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

于 2011-06-07T03:10:57.187 回答
2

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

在此处输入图像描述

现在对于您的问题,为什么 的 3D 图与具有相同控制点的 a 的BSplineFunction结果不同。问题是您假设 中的两个参数对应于笛卡尔坐标系的 x 和 y。好吧,他们没有。这些参数是表面内部参数描述的一部分,其中改变这两个参数会产生一组 3D 点,因此您必须在此处使用。Graphics3DBSplineSurfaceBSplineFunctionParametricPlot3D

所以,如果你换成你的,Plot3DParametricPlot3D会发现一切都很好。

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

于 2011-06-07T13:24:32.213 回答