有没有办法控制Matlab的3D查看器中的失真?

时间:2015-10-09 14:15:35

标签: matlab opengl 3d

这个问题的背景与我尝试将光线跟踪器的输出与Matlab的3d绘图仪相结合。进行光线跟踪时,无需对渲染图像应用透视变换。您在下图中看到了这一点。基本上,光线与视口的交点将自动调整透视缩放。

ray tracer

假设我已经离开并创建了一个光线跟踪图像(因此我获得了相机,我的焦距,视口尺寸等)。如何在Matlab的3d绘图环境中创建完全相同的视图?

以下是一个例子:

clear
close all

evec = [0 200 300]; % Camera position

recw = 200;         % cm width of box
recl = 200;         % cm length of box
h = 150;            % cm height of box

% Create the front face rectangle
front = zeros(3,5);
front(:,1) = [-recw/2; 0; -recl/2];
front(:,2) = [recw/2; 0; -recl/2];
front(:,3) = [recw/2; h; -recl/2];
front(:,4) = [-recw/2; h; -recl/2];
front(:,5) = front(:,1);

% Back face rectangle
back = zeros(3,5);
back(:,1) = [-recw/2; 0; recl/2];
back(:,2) = [recw/2; 0; recl/2];
back(:,3) = [recw/2; h; recl/2];
back(:,4) = [-recw/2; h; recl/2];
back(:,5) = back(:,1);

% Plot the world view
figure(1);
patch(front(1,:), front(2,:), front(3,:), 'r'); hold all
patch(back(1,:), back(2,:), back(3,:), 'b');
plot3(evec(1), evec(2), evec(3), 'bo');
xlabel('x'); ylabel('y'); zlabel('z');
title('world view'); view([-30 40]);

% Plot the camera view
figure(2);
patch(front(1,:), front(2,:), front(3,:), 'r'); hold all
patch(back(1,:), back(2,:), back(3,:), 'b');
xlabel('x'); ylabel('y'); zlabel('z');
title('Camera view');


campos(evec);
camup([0 1 0]); % Up vector is y+
camproj('perspective');
camtarget([evec(1), evec(2), 0]);
title('camera view');

现在您可以看到世界视图

world view

和相机视图

camera view

我知道如何调整相机位置,相机视角和方向以匹配光线追踪器的输出。但是,我不知道如何调整Matlab的内置透视命令

camproj('perspective')

针对不同的扭曲。

注意:在文档中,有viewmtx命令,它允许您输出与某个角度的透视失真相对应的变换矩阵。这不是我想要的。我想用3D做事并通过Matlab的OpenGL查看器。本质上,我想要一个像

这样的命令
camproj('perspective', distortionamount)

因此我可以将Matlab查看器中的失真量与光线跟踪器的失真相匹配。如果使用viewmtx命令创建2D投影,则无法使用patch' or surf'并保持颜色和面部完整。

1 个答案:

答案 0 :(得分:1)

MATLAB透视投影就像你的光线跟踪器一样。你不需要任何转换矩阵来使用它。透视失真完全取决于摄像机的位置和投影方向。

在上面的光线跟踪图的术语中,如果CameraPosition与光线跟踪器的针孔坐标匹配且CameraPositionCameraTarget之间的矢量垂直于光线跟踪器的视口,则视角扭曲将为也匹配。其余的只是缩放和对齐。