MATLABで作成し​た曲線をstlに描き​出したいです

9 views (last 30 days)
HY
HY on 1 Oct 2023
Commented: HY on 1 Dec 2023
MATLABでベジエ曲線を導き、その曲線(2次元or3次元)部分のみをstlファイルに描き出し、3dCADでモデル作成に用いたいです。
また、その曲線の縮尺設定(例:グラフ上の数値1=1㎜)をMATLAB内ですることは可能でしょうか。
  3 Comments
Atsushi Ueno
Atsushi Ueno on 1 Oct 2023
作成したベジエ曲線のシンボリック式は多項式なので、sym2poly 関数で係数の抽出、polyval関数で多項式の計算が出来ます。ここまで書いて気付いたのですが、STL フォーマットは三角形分割された3次元の面情報を記述するフォーマットなので、ベジエ曲線(2D/3D)の情報をどうやって載せるかが問題になります。何らかの形で線データを面データとして扱う様にするか、線分を扱えるDXF等のフォーマットを採用するか、等の対応が必要です。
P = [0 -2; 1 -3; 2 -2; 3 2; 4 2; 5 0];
syms t
B = bernsteinMatrix(5,t);
bezierCurve = simplify(B*P);
bc1 = sym2poly(bezierCurve(1)); % ベジエ曲線の多項式係数を抽出
bc2 = sym2poly(bezierCurve(2)); % ベジエ曲線の多項式係数を抽出
plot(polyval(bc1,0:0.01:1), polyval(bc2,0:0.01:1)) % 数値解(点群)を得てからプロット
%stlwrite(TR,'test.stl','text'); % TRは triangulation オブジェクトまたは 2 次元 delaunayTriangulation オブジェクト
HY
HY on 3 Oct 2023
ご回答いただき誠にありがとうございます。
『何らかの形で線データを面データとして扱う様にするか、線分を扱えるDXF等のフォーマットを採用するか、等の対応が必要です。』こちらの文の内容を実行する方法はUeno様はご存じでしょうか?
また、参考で載せていただいた内容のようにMATLAB内で曲線に肉付けし、STLフォーマットを利用したほうが良いのでしょうか?

Sign in to comment.

Accepted Answer

Atsushi Ueno
Atsushi Ueno on 3 Oct 2023
Moved: Atsushi Ueno on 8 Oct 2023
> MATLAB内で曲線に肉付けし、STLフォーマットを利用したほうが良いのでしょうか?
3DCADがSTLフォーマットしか受け付けないのであれば、STLフォーマットを利用した法が良いでしょう
>曲線(2次元or3次元)部分のみをstlファイルに描き出し、3dCADでモデル作成に用いたいです。
リンク先を参考に、自分でもやってみました。XY平面の曲線をZ方向に伸ばして、triangulation 関数で三角形メッシュに区切り、stlwrite 関数でSTLフォーマット形式ファイルを書き出しました。
>その曲線の縮尺設定(例:グラフ上の数値1=1㎜)をMATLAB内ですることは可能でしょうか
MATLABでも可能です。単に頂点リストの数値をスケーリング(係数倍)するなり移動(加減算)すれば良いです。
P = [0 -2; 1 -3; 2 -2; 3 2; 4 2; 5 0];
syms t
B = bernsteinMatrix(5,t);
bezierCurve = simplify(B*P);
bc1 = sym2poly(bezierCurve(1)); % ベジエ曲線の多項式係数を抽出
bc2 = sym2poly(bezierCurve(2)); % ベジエ曲線の多項式係数を抽出
range = 0:0.1:0.9; szrng = size(range); s = szrng(2); h = s/2;
dat = [polyval(bc1,range); polyval(bc2,range); zeros(szrng)]'; % ベジエ曲線の頂点を抽出
P = repmat(dat,2,1); P(size(dat,1)+1:end,3) = 1; % ベジエ曲線の頂点リスト(Z方向にずらしてコピー)
T = repmat([1,2,1;1,2,2],s-1,1) + repelem(0:s-2,3,2)' + repmat([0,0,s;s,s,0],s-1,1); % 三角形分割連結リスト
TR = triangulation(T,P); % 3次元三角形分割データの作成
stlwrite(TR,'test.stl','text'); % STLファイルの作成
type test.stl
solid MATLAB_1 facet normal -0.50665158 -0.862150908 0 outer loop vertex 0 -2 0 vertex 0.5 -2.29382992 0 vertex 0 -2 1 endloop endfacet facet normal 0.50665158 0.862150908 0 outer loop vertex 0 -2 1 vertex 0.5 -2.29382992 1 vertex 0.5 -2.29382992 0 endloop endfacet facet normal 0.224647418 -0.974440098 0 outer loop vertex 0.5 -2.29382992 0 vertex 1 -2.17856002 0 vertex 0.5 -2.29382992 1 endloop endfacet facet normal -0.224647418 0.974440098 0 outer loop vertex 0.5 -2.29382992 1 vertex 1 -2.17856002 1 vertex 1 -2.17856002 0 endloop endfacet facet normal 0.681694984 -0.731636465 0 outer loop vertex 1 -2.17856002 0 vertex 1.5 -1.71269 0 vertex 1 -2.17856002 1 endloop endfacet facet normal -0.681694984 0.731636465 0 outer loop vertex 1 -2.17856002 1 vertex 1.5 -1.71269 1 vertex 1.5 -1.71269 0 endloop endfacet facet normal 0.814817071 -0.579718173 0 outer loop vertex 1.5 -1.71269 0 vertex 2 -1.00992 0 vertex 1.5 -1.71269 1 endloop endfacet facet normal -0.814817071 0.579718173 0 outer loop vertex 1.5 -1.71269 1 vertex 2 -1.00992 1 vertex 2 -1.00992 0 endloop endfacet facet normal 0.84533757 -0.534232557 0 outer loop vertex 2 -1.00992 0 vertex 2.5 -0.21875 0 vertex 2 -1.00992 1 endloop endfacet facet normal -0.84533757 0.534232557 0 outer loop vertex 2 -1.00992 1 vertex 2.5 -0.21875 1 vertex 2.5 -0.21875 0 endloop endfacet facet normal 0.820128202 -0.572179794 0 outer loop vertex 2.5 -0.21875 0 vertex 3 0.497920007 0 vertex 2.5 -0.21875 1 endloop endfacet facet normal -0.820128202 0.572179794 0 outer loop vertex 2.5 -0.21875 1 vertex 3 0.497920007 1 vertex 3 0.497920007 0 endloop endfacet facet normal 0.696457565 -0.717597961 0 outer loop vertex 3 0.497920007 0 vertex 3.5 0.98319 0 vertex 3 0.497920007 1 endloop endfacet facet normal -0.696457565 0.717597961 0 outer loop vertex 3 0.497920007 1 vertex 3.5 0.98319 1 vertex 3.5 0.98319 0 endloop endfacet facet normal 0.239555582 -0.970882654 0 outer loop vertex 3.5 0.98319 0 vertex 4 1.10655999 0 vertex 3.5 0.98319 1 endloop endfacet facet normal -0.239555582 0.970882654 0 outer loop vertex 3.5 0.98319 1 vertex 4 1.10655999 1 vertex 4 1.10655999 0 endloop endfacet facet normal -0.541710556 -0.840565085 0 outer loop vertex 4 1.10655999 0 vertex 4.5 0.78433001 0 vertex 4 1.10655999 1 endloop endfacet facet normal 0.541710556 0.840565085 0 outer loop vertex 4 1.10655999 1 vertex 4.5 0.78433001 1 vertex 4.5 0.78433001 0 endloop endfacet endsolid MATLAB_1
  2 Comments
Atsushi Ueno
Atsushi Ueno on 3 Oct 2023
Moved: Atsushi Ueno on 8 Oct 2023
DXFファイルについては、線分の頂点リストをDXFフォーマットに従い出力すれば良いです。MATLABはDXFファイルを扱っていませんが、File Exchangeには同士の作成したDXFファイル作成関数が多数あります。今回の目的(線分データをDXFファイルに出力)に最も近い下記の関数を実行してみました。
P = [0 -2; 1 -3; 2 -2; 3 2; 4 2; 5 0];
syms t
B = bernsteinMatrix(5,t);
bezierCurve = simplify(B*P);
bc1 = sym2poly(bezierCurve(1)); % ベジエ曲線の多項式係数を抽出
bc2 = sym2poly(bezierCurve(2)); % ベジエ曲線の多項式係数を抽出
range = 0:0.1:0.9;
writedxf('temp',polyval(bc1,range),polyval(bc2,range),zeros(size(range))); % DXFファイルの作成
type temp.dxf
999 created by Matlab 0 SECTION 2 ENTITIES 0 LINE 8 0 10 0.0000 20 -2.0000 30 0.0000 11 0.5000 21 -2.2938 31 0.0000 0 LINE 8 0 10 0.5000 20 -2.2938 30 0.0000 11 1.0000 21 -2.1786 31 0.0000 0 LINE 8 0 10 1.0000 20 -2.1786 30 0.0000 11 1.5000 21 -1.7127 31 0.0000 0 LINE 8 0 10 1.5000 20 -1.7127 30 0.0000 11 2.0000 21 -1.0099 31 0.0000 0 LINE 8 0 10 2.0000 20 -1.0099 30 0.0000 11 2.5000 21 -0.2188 31 0.0000 0 LINE 8 0 10 2.5000 20 -0.2188 30 0.0000 11 3.0000 21 0.4979 31 0.0000 0 LINE 8 0 10 3.0000 20 0.4979 30 0.0000 11 3.5000 21 0.9832 31 0.0000 0 LINE 8 0 10 3.5000 20 0.9832 30 0.0000 11 4.0000 21 1.1066 31 0.0000 0 LINE 8 0 10 4.0000 20 1.1066 30 0.0000 11 4.5000 21 0.7843 31 0.0000 0 ENDSEC 0 EOF
HY
HY on 1 Dec 2023
遅くなってしまい申し訳ございません。無事実行することができました!
ありがとうございました。

Sign in to comment.

More Answers (0)

Categories

Find more on モデルのインポート in Help Center and File Exchange

Products


Release

R2023b

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!