Main Content

isonormals

等値面の頂点の法線を計算

構文

n = isonormals(X,Y,Z,V,vertices)
n = isonormals(V,vertices)
n = isonormals(V,p)
n = isonormals(X,Y,Z,V,p)
n = isonormals(...,'negate')
isonormals(V,p)
isonormals(X,Y,Z,V,p)

説明

n = isonormals(X,Y,Z,V,vertices) は、頂点に関するリスト vertices から、データ V の勾配を使用して、等値面頂点の法線を計算します。配列 XYZ は、3 次元物体 V に関する座標を定義します。計算される法線は、n に返されます。

n = isonormals(V,vertices) は、配列 XYZ が、[m,n,p] = size(V) である [X,Y,Z] = meshgrid(1:n,1:m,1:p) として定義されていることを前提としています。

n = isonormals(V,p)n = isonormals(X,Y,Z,V,p) は、ハンドル p で識別されるパッチの頂点からの法線を計算します。

n = isonormals(...,'negate') は、法線を打ち消し (法線を逆方向に計算し) ます。

isonormals(V,p)isonormals(X,Y,Z,V,p) は、値を返すのではなく、計算された法線を、ハンドル p により識別されるパッチの VertexNormals プロパティに設定します。

すべて折りたたむ

ライトを照射された等値面のさまざまな面法線の影響を比較します。一例として、三角形を使って、法線を定義する等値面を作成します。また、関数 isonormals はボリューム データを使用してデータ点の勾配をベースに頂点法線を計算します。後者の方が、一般に、スムーズに表現できます。

ボリューム データの 3 次元配列を定義します。

data = cat(3,[0 .2 0; 0 .3 0; 0 0 0],...
    [.1 .2 0; 0 1 0; .2 .7 0],...
    [0 .4 .2; .2 .4 0;.1 .1 0]);
data = interp3(data,3,'cubic');

物体データから等値面を描き、ライトを付加します。ここでは、三角形による法線計算を行っています。

tiledlayout(1,2)
nexttile
fv = isosurface(data,.5);
p1 = patch(fv,'FaceColor','red','EdgeColor','none');
view(3)
daspect([1,1,1])
axis tight
camlight
camlight(-80,-10)
lighting gouraud
title('Triangle Normals')

Figure contains an axes object. The axes object with title Triangle Normals contains an object of type patch.

ボリューム データから計算される法線を使用して、同じライトを照射された等値面を描画します。

nexttile
fv = isosurface(data,.5);
p2 = patch(fv,'FaceColor','red','EdgeColor','none');
isonormals(data,p2)
view(3) 
daspect([1 1 1])
axis tight
camlight 
camlight(-80,-10) 
lighting gouraud
title('Data Normals')

Figure contains 2 axes objects. Axes object 1 with title Triangle Normals contains an object of type patch. Axes object 2 with title Data Normals contains an object of type patch.

以下の図は、法線の算出の 2 つの方法の違いを示したものです。

拡張機能

バージョン履歴

R2006a より前に導入