以下是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函数。 我想一般方法将能够在连续的BSplines表示中转换Mathematica 3D表示。
现在我们将根据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]
我在这里犯了一些概念上的错误吗?
答案 0 :(得分:2)
我认为您的问题需要进一步澄清。
.3DS主要是像这样的Polygon集:
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]]}]
因此,如何让Spline曲面对此进行建模并不明显。
也许你可以用这个例子详细说明一下。
HTH!
答案 1 :(得分:2)
次要细节:您的样条曲线有点扭曲,这是因为您选择了SplineDegree
。对于金字塔案例,我选择{2,1}而不是{1,2}。
那会给你一个圆锥而不是你现在拥有的软冰锥。当然,这一切都是相当随意的,美丽在旁观者的眼中。
现在您的问题为什么BSplineFunction
的3D绘图与具有相同控制点的Graphics3D
的{{1}}的结果不同。问题是你假设BSplineSurface
中的两个参数对应于笛卡尔坐标系的x和y。好吧,他们没有。这些参数是曲面内部参数化描述的一部分,其中改变这两个参数会产生一组3D点,因此您必须在此处使用BSplineFunction
。
因此,如果您将ParametricPlot3D
更改为Plot3D
,您会发现一切正常。
我希望这能回答你最后的问题。这是否也回答了如何将基于3D多边形的模型转换为基于样条的模型的问题?您遇到的一个问题是样条曲线通常不会通过其控制点,作为一种插值函数。