这是一个3D几何体的示例。
dat=Import["ExampleData/747.3ds.gz", ImageSize -> Medium]现在,如果有人想要为这个3D几何图形获得一个BSplineFunction,最简单的方法是什么?
我可以使用以下命令在Mathematica中查看各个部分。
parts = Length[(dat // First // Last)];这是提取后的三维点。
ListPointPlot3D[Flatten[Map[((dat // First // Last)[[#]] /.
GraphicsComplex[a_, b_] -> List[a]) &, Range[parts]], 1]]我希望有一个通用的方法,这样我们就可以从任何3D图形复杂结构中形成一个BSpline函数。我认为通用的方法将能够将Mathematica3D表示转换为连续的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]

那么我是不是犯了一些概念性的错误呢?
发布于 2011-06-07 11:10:57
我认为你的问题需要进一步澄清。
.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-07 21:24:32
次要细节:你的样条线有点扭曲,这是因为你选择了SplineDegree。对于金字塔的情况,我会选择{2,1}而不是{1,2}。这将给你一个圆锥体,而不是你现在拥有的软冰锥。当然,这一切都是武断的,美丽在观者的眼睛里。

现在来回答你的问题,为什么BSplineFunction的3D绘图不能给出与具有相同控制点的BSplineSurface的Graphics3D相同的结果。问题是您假设BSplineFunction中的两个参数对应于笛卡尔坐标系的x和y。这些参数是曲面内部参数描述的一部分,在内部参数描述中,改变这两个参数会产生一组3D点,所以你必须在这里使用ParametricPlot3D。
因此,如果您将Plot3D更改为ParametricPlot3D,您将看到一切都很好。
我希望这能回答你的最后一个问题。这是否也回答了您的问题:如何将基于3D多边形的模型转换为基于样条的模型?你面临的一个问题是,作为一种插值函数,样条通常不会通过它的控制点。
https://stackoverflow.com/questions/6259345
复制相似问题