我已经在Mathwork的网站上问了这个问题,所以如果不允许交叉发布,请告诉我,我将其删除。
我正在尝试在MATLAB中一起渲染小对象和大对象。我正在使用相机命令来限制我的视野,以便可以看到两者。但是,当我这样做时,对小对象的隐藏线删除将失败。我本以为隐藏浮点消除将以浮点数的机器精度完成,但似乎没有。这是我的显卡的功能,还是可以解决此问题? 下面的代码是我可以提出的最小示例。在具有默认限制的轴上进行绘制,隐藏线去除效果很好(左)当轴设置为较大范围(与对象相比)时,线去除失败(中)。当我使轴消失时,情况再次恢复正常(右)。
在此示例中,我可以隐藏轴,并且输出看起来正确。但是对于我实际上想做的事情,这不是一个选择。有什么建议,或者有人可以指出要正确渲染的场景中最小和最大对象之间的适当限制? 上面生成球体的代码如下。预先感谢!
由MATLAB 2018A生成的图像
clearvars
F1 = figure(1);
clf
set(F1,'color',[1 1 1],'Renderer','opengl'); % have to enable this to clip surfaces behind the camera
for step = [2 1 3] % out of order because the axis in case 2 is trying to hide the first plot
subplot(1,3,step)
view(gca,3);
camproj(gca,'Perspective'); % have to enable this to clip surfaces behind the camera
[Xs,Ys,Zs] = sphere(20);
r = 30e-6;
surf(gca,Xs*r,Ys*r,Zs*r);
axis(gca,'equal');
% three different behaviors, pick a number 1, 2, or 3
switch step
case 1 % this plots the sphere correctly
%axis([-2 2 -2 2 -2 2]);
%axis off
case 2 % this messes up the hidden line removal
axis([-2 2 -2 2 -2 2]);
%axis off
case 3 % removing the axis walls fixes things again
axis([-2 2 -2 2 -2 2]);
axis off
end
% put viewpoint on unit sphere
camera_pos = get(gca,'CameraPosition');
mag_camera_pos = sqrt(sum(camera_pos.^2));
camera_pos = camera_pos / mag_camera_pos;
set(gca,'CameraPosition',camera_pos);
final_angle = 2.5*atand(r/1);
set(gca,'CameraViewAngle',final_angle);
end
drawnow