MATLAB Answers

ボクセル表現されたモ​デルの表面部分のみを​描画する方法

34 ビュー (過去 30 日間)
nito
nito 2021 年 9 月 24 日 3:26
コメント済み: nito 2021 年 9 月 24 日 6:22
ボクセルで簡易的な切削シミュレータ(被削材の形状変化をボクセルで表現)を実装したいと思っているのですが,オブジェクト数を抑えて描画する方法が分かりません.現状はpatch('Faces',F,'Vertices',V)を用いて,対象の全領域に直方体を描画してしまっているため,まずは表面のみを描画するように変更したいと考えています.
そのため,以下3点を教えていただけますでしょうか.
1. 対象の体積領域を表す元データ(3次元配列)から表面部分のみのデータを取得する方法
2. 1の逆変換
3. 元データの形状が変化した際に素早く対応した表面データを得る方法(※簡易的に実装できるものがあれば)

採用された回答

Shunichi Kusano
Shunichi Kusano 2021 年 9 月 24 日 5:38
下のコードのように考えてみました。
モルフォロジー処理を利用していますが、切削形状によっては上手くいかないこともあるかもしれません。
%% ダミーデータ
test = zeros(100,100,100);
test(10:90,10:90,10:90) = 1;
volshow(test)
%% 表面ピクセルの取得
test_erode = imerode(test,strel('cube',3)); % モルフォロジー処理
test_surf = test & ~test_erode; % 元のボリュームからの差分が表面に相当
volshow(test_surf);
%% 復元
test_reconstruct = imfill(test_surf,'holes');
val = test == test_reconstruct;
any(~val(:)) % 復元を確認
%% 削る
test2 = test;
test2(80:90,80:90,80:90) = 0;
volshow(test2);
%% 削った部分
part = test & ~test2;
volshow(part)
%% 削った部分に接する元のボリュームの面
surf_on_part = test2 & imdilate(part,strel('cube',3));
test_label = test2;
test_label(surf_on_part) = 2;
labelvolshow(test_label,test2);
  1 件のコメント
nito
nito 2021 年 9 月 24 日 6:22
早々にご回答いただきありがとうございます.
こういった方法があったのですね.とても参考になりました.
実際の形状で試してみたいと思います.

サインインしてコメントする。

その他の回答 (0 件)

製品

Community Treasure Hunt

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

Start Hunting!