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]
ここで概念的な間違いを犯していますか?