6
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

MATLABで裸眼立体視

Last updated at Posted at 2020-12-22

 MATLABの3D図は、マウス操作でグリグリと回せるので、そのままでも立体感は得られます。しかし、静止したままの図を立体感を感じながらじっくりと観察できれば、また別の発想が湧いてきそうな気もします。ということで、左右像で裸眼立体視できる3Dグラフを作ってみました。MATLABが描く画像の大きさは、自分のPC上で最適になるような設定にしています。皆さんの環境に合わせて適宜調整してください。左右のz軸の間隔が60~65mm程度になるようにするのが最適です。

 しかし、この下のスクリーンコピーした画像は、ブラウザの横幅を変えるだけで間隔の調整は自在です。適当に調整してご覧になってください。予想外の立体感に感動します。

 プログラムは長々と続いていますが、前半はごく普通の作図処理です。裸眼立体視に必要なのは最後の19行だけです。

stereo01.jpg

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
6
2
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
6
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?