Bye Bye Moore

PoCソルジャーな零細事業主が作業メモを残すブログ

GNU Octaveで画像を重ね合わせ三次元モデルをつくる その1:isosurfaceメソッドで行列データをもとに三次元的にプロットする

isosurfaceは日本語で等値面といい、身近なトコだと地図の等高線みたいなもんです。
それを重ね合わせれば、三次元モデルができるというお話。
取っ掛かりとして、三次元データの重ね合わせで疑似的な3D表示をすることを目指します。

実際のところ

まずは写経。

 clf; # 画面クリア
 [x,y,z] = meshgrid (-2:0.5:2, -2:0.5:2, -2:0.5:2);
 v = x.^2 + y.^2 + z.^2;
 isosurface (x, y, z, v, 3);
 isosurface (x, y, z, v, 5);
 axis equal;
 title ("isosurfaces of two nested spheres");

f:id:shuzo_kino:20201206001736p:plain


で、実際にオリジナルをば。
数学クソ雑魚なので、平面を

clf; # 画面クリア
[x,y,z] = meshgrid (-2:0.5:2, -2:0.5:2, -2:0.5:2);
v = x.*2 + y.*2 + z.*2;
isosurface (x,y,z,v,1);
isosurface (x,y,z,v,2);
isosurface (x,y,z,v,3);

f:id:shuzo_kino:20201206004917p:plain
良さそうですね。

では間隔を密にして重ねてみましょうか

clf; # 画面クリア
[x,y,z] = meshgrid (-2:0.5:2, -2:0.5:2, -2:0.5:2);
v = x.*2 + y.*2 + z.*2;
for i = 1:100,
isosurface (x,y,z,v,0.01*i);
end;

f:id:shuzo_kino:20201206005900p:plain
f:id:shuzo_kino:20201206010121p:plain
図形の単純さの割にクッソ重いのができました。
字義通り等値な部分だけレンダリングすれば軽く早くなるのでしょうが……。