MATLABの3D図は、マウス操作でグリグリと回せるので、そのままでも立体感は得られます。しかし、静止したままの図を立体感を感じながらじっくりと観察できれば、また別の発想が湧いてきそうな気もします。ということで、左右像で裸眼立体視できる3Dグラフを作ってみました。MATLABが描く画像の大きさは、自分のPC上で最適になるような設定にしています。皆さんの環境に合わせて適宜調整してください。左右のz軸の間隔が60~65mm程度になるようにするのが最適です。
しかし、この下のスクリーンコピーした画像は、ブラウザの横幅を変えるだけで間隔の調整は自在です。適当に調整してご覧になってください。予想外の立体感に感動します。
プログラムは長々と続いていますが、前半はごく普通の作図処理です。裸眼立体視に必要なのは最後の19行だけです。
stereo01.m
clear
close all
o=[0 0 0]; % 原点
ex=[1 0 0]; % x軸頂点のx,y,z座標
ey=[0 1 0]; % y軸頂点のx,y,z座標
ez=[0 0 1]; % z軸頂点のx,y,z座標
p=[0.7 1 1]*0.9; % 任意ベクトルの頂点p
xp=[p(1) 0 0]; % p点のx軸への垂直投影点xp
yp=[0 p(2) 0]; % p点のy軸への垂直投影点yp
zp=[0 0 p(3)]; % p点のz軸への垂直投影点zp
p0=[p(1) p(2) 0]; % p点のxy平面上への垂直投影点p0
figure(1)
plot3([0 ex(1)],[0 ex(2)],[0 ex(3)],'b','LineWidth',2); % x軸
view(130,12); % ここの一連のコマンドは、
axis equal % 記述位置を変えると、
axis([-0.2 1.2 -0.2 1.2 -0.2 1.2]); % 期待に沿わない表示に
grid on % なるので、要注意。
hold on % 原因は未確認。
plot3([0 ey(1)],[0 ey(2)],[0 ey(3)],'b','LineWidth',2); % y軸
plot3([0 ez(1)],[0 ez(2)],[0 ez(3)],'b','LineWidth',2); % z軸
plot3([0 p(1)],[0 p(2)],[0 p(3)],'r','LineWidth',2); % 任意ベクトル
text(ex(1)+0.1,ex(2),ex(3),'x','FontSize',18); % x軸の先端文字
text(ey(1),ey(2)+0.1,ey(3),'y','FontSize',18); % y軸の先端文字
text(ez(1),ez(2),ez(3)+0.1,'z','FontSize',18); % z軸の先端文字
text(p(1)+0.057,p(2)+0.057,p(3)+0.057,'p','FontSize',18); % 任意ベクトルの先端文字
plot3([p(1) xp(1)],[p(2) xp(2)],[p(3) xp(3)],'k','LineWidth',0.75); % p-xp線
plot3([p(1) yp(1)],[p(2) yp(2)],[p(3) yp(3)],'k','LineWidth',0.75); % p-yp線
plot3([p(1) zp(1)],[p(2) zp(2)],[p(3) zp(3)],'k','LineWidth',0.75); % p-zp線
plot3([p0(1) p(1)],[p0(2) p(2)],[p0(3) p(3)],'k','LineWidth',0.75); % p-p0線
plot3([p0(1) xp(1)],[p0(2) xp(2)],[p0(3) xp(3)],'k','LineWidth',0.75); % p0-xp線
plot3([p0(1) yp(1)],[p0(2) yp(2)],[p0(3) yp(3)],'k','LineWidth',0.75); % p0-yp線
plot3([p0(1) o(1)],[p0(2) o(2)],[p0(3) o(3)],'k','LineWidth',0.75); % o0-p0線
xlabel('X');
ylabel('Y');
zlabel('Z');
h1=get(gca,'Children'); % figure(1)をコピーする。
% 裸眼立体視用の左右2つの画像を入れる窓を作る。
figure('Position',[250 200 800 400]); % 指定サイズの新figureを作る(figure(2)となる)
% 新figureの中に左目用の画像を描く。
axes('Position',[0.18 0.2 0.3 0.6],'Projection','perspective'); % 第1の座標面を作る。
copyobj(h1,gca); % figure(1)を貼り付ける。
title('裸眼立体視(左目用)')
view(130,12); % 貼り付けても、視点などの属性は無視されるので、
axis equal % 元の属性と同じものを再設定する。
axis([-0.2 1.2 -0.2 1.2 -0.2 1.2]);
grid on
% 新figureの中に右目用の画像を描く。
axes('Position',[0.50 0.2 0.3 0.6],'Projection','perspective'); % 第2の座標面を作る。
copyobj(h1,gca); % figure(1)を貼り付ける。
title('裸眼立体視(右目用)')
view(135,12); % 右目用に、左目用とはazimuthだけが異なる属性を設定する。
axis equal
axis([-0.2 1.2 -0.2 1.2 -0.2 1.2]);
grid on