Как сформировать функцию BSpline из импорта 3DS / OBJ в Mathematica - PullRequest
1 голос
/ 07 июня 2011

Вот пример трехмерной геометрии.

dat=Import["ExampleData/747.3ds.gz", ImageSize -> Medium]

Теперь, если кто-то хочет получить функцию BSplineFunction для этой трехмерной геометрии, какой самый простой способ сделать это?

Я вижучасти в Mathematica, используя следующую команду.

parts = Length[(dat // First // Last)];

и вот идут 3D-точки после извлечения.

ListPointPlot3D[Flatten[Map[((dat // First // Last)[[#]] /. 
  GraphicsComplex[a_, b_] -> List[a]) &, Range[parts]], 1]]

Я надеюсь, что есть общий метод, чтобы мы могли сформировать функцию BSplineиз любого комплекса трехмерной графики.Полагаю, что общий метод сможет преобразовывать трехмерные представления Mathematica в непрерывное представление 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]]}]

enter image description here

Мы можем просто сформировать вход для поверхности 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
    ]

enter image description here

Как только эта поверхность сформирована, я думал, что можно будет каким-то образом создать функцию BSplineFunction.Но то, что я получаю, полностью отличается от приведенной выше поверхности.

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

enter image description here

Итак, я делаю здесь некоторую концептуальную ошибку?

Ответы [ 2 ]

2 голосов
/ 07 июня 2011

Незначительные детали: ваш сплайн немного искажен, и это из-за вашего выбора SplineDegree.Для случая с пирамидой я бы выбрал {2,1} вместо {1,2}.Это даст вам конус вместо конуса с мягким льдом, который у вас сейчас есть.Конечно, все это довольно произвольно, и красота в глазах смотрящего.

enter image description here

Теперь на ваш вопрос, почему 3D-сюжет BSplineFunction не даеттот же результат, что и Graphics3D для BSplineSurface с теми же контрольными точками.Проблема в том, что вы предполагаете, что два параметра в BSplineFunction соответствуют x и y декартовой системы координат.Ну, они этого не делают.Эти параметры являются частью внутреннего параметрического описания поверхности, в котором изменение этих двух параметров дает набор трехмерных точек, поэтому вы должны использовать ParametricPlot3D здесь.

Итак, если вы измените свой Plot3D в ParametricPlot3D вы увидите, что все в порядке.

Я надеюсь, что это ответит на ваш последний вопрос.Это также отвечает на ваш вопрос, как преобразовать трехмерную модель на основе многоугольника в модель на основе сплайна?Одна из проблем, с которой вы сталкиваетесь, заключается в том, что сплайн обычно не проходит через свои контрольные точки, как своего рода интерполяционная функция.

2 голосов
/ 07 июня 2011

Я думаю, ваш вопрос нуждается в дальнейшем уточнении.

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

enter image description here

Итак, не очевидно, как получить сплайн-поверхности для моделирования этого.

Возможно, вы можете немного проработать этот пример.

HTH!

...