Я задал этот вопрос на сайте 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