14
4

More than 1 year has passed since last update.

【MATLAB】3次元形状データ(STLファイル)の扱いについて(読み込み・プロット)

Last updated at Posted at 2021-08-10

はじめに

 研究をやっていると、シミュレーション結果を3次元でプロットしたいときがあると思います。私の周りでも苦労している方がいるようです。私も昨年、MATLAB上でSTLファイルをインポートし、アニメーションを作りましたが苦労した記憶があります。シミュレーションの計算結果をアニメーションで見える化したいという需要はありそうなので、MATLABでのSTLモデルの扱い方についてまとめます。

STLとは

 3次元データのファイルフォーマットの一つ。詳しいことは、Wiki参照

他にもOBJとかFBXとかある。3Dプリンターを使ったことがある人は、STL形式は馴染み深いと思います。

環境

MATLAB R2020b

STLファイルをMATLABにインポートする

データの準備

 まずはSTLファイルを用意します。私はここから宇宙機の形状データをダウンロードしました。カッシーニにしました。ちなみに、windows 10 には、標準で3Dビューアーというソフトが入っているので、そのソフトを使用すれば3D形状を確認することができます。

インポート

 MATLABへのインポートは、stlread関数を使用します。cassini.stlをMATLABにインポートします。下記のコードではその後、model という構造体を作成しています。

TR = stlread('cassini.stl');

model.Vertices = TR.Points;
model.Faces    = TR.ConnectivityList;

これにより、modelという3次元形状のデータが格納された構造体が作成されます。model.Verticesには各頂点の x, y, z 座標が、model.Facesにはどの頂点を結んで面を作成するか、という情報が入っています。

プロット

 次に、3次元形状をプロットしてみます。プロットには、patch関数を使用します。

figure(1), clf
patch(model)
view([20 20])

出力
image.png

view([20 20])は、3次元プロットを見る角度を指定しています。形状の出力はできたけれど、真っ黒です。真っ黒なので、2次元に見えます。これは、パッチのプロパティをいじれば大丈夫です。'FaceColor'に色を設定します。

figure(2), clf
patch(model, 'FaceColor', [0.8 0.8 1.0])
view([20 20])

出力
image.png

色が付きました。これで3次元に見えると思います。しかし、ポリゴンのエッジの線が表示されているので、黒くなっている部分もあります。これは、パッチの'EdgeColor'プロパティを設定することで、非表示にすることが可能です。

figure(3), clf
patch(model, 'FaceColor', [0.8 0.8 1.0], ...
    'EdgeColor', 'none')
view([20 20])

出力
image.png

エッジの線は消えましたが、また2次元に見えるようになってしまいました。ここに光源の設定をすることで、凹凸がわかる3次元形状のプロットが完成します。見た目をリアルにするために、パッチのプロパティも少し変更を加えます。

figure(4), clf
patch(model, 'FaceColor', [0.8 0.8 1.0], ...
    'EdgeColor', 'none', ...
    'FaceLighting', 'gouraud', ...
    'AmbientStrength', 0.15)
view([20 20])
lightangle(-45,70)

出力
image.png

これは感動ですね。しかし、まだ問題点があります。ウィンドウのサイズを変えてしまうと、プロットの軸のサイズも合わせて変わってしまいます。
image.png

この問題点は、軸の比を設定すれば解決できます。下記のコードが完成形です。

figure(5), clf
patch(model, 'FaceColor', [0.8 0.8 1.0], ...
    'EdgeColor', 'none', ...
    'FaceLighting', 'gouraud', ...
    'AmbientStrength', 0.15)
view([20 20])
lightangle(-45,70)
set(gca, 'DataAspectRatio',[1 1 1])

これで、ウィンドウのサイズを変更すると、軸のサイズも動的に変更されます。
image.png

完成。

おわりに

 これで、STLファイルをMATLABにインポートし、プロットをすることができます。FaceColorの値を変更すれば、好みの色にすることもできます。ここからアニメーションを作成するには、物体の頂点の座標に手を加えればよいです。これについては後日書きます。

14
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
14
4