Limitation to Hidden Line Removal?

2 views (last 30 days)
Wick
Wick on 24 May 2019
I'm trying to render small objects and large objects together. I'm using the camera commands to restrict my field of view such that I can see both. However, when I do that, the hidden line removal fails on the small objects. I would have thought that hidden line removal would have been done at machine precision for floats, but it appears not. Is this a function of my graphics card or can I work around this?
The code below is the minimum example I could come up with. Plotted on an axis with default limits, the hidden line removal works fine (left) When the axis is set to large extents (compared to the object) the line removal fails (middle). When I make the axis disappear things are fine again (right).
For this example, I can just hide the axis and the output looks correct. But for what I'm actually trying to do, that's not an option. Any suggestions or can someone point me to the proper limit between the smallest and largest objects in a scene that will properly render?
The code to generate the spheres above is below. Thanks in advance!
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)
set(gca,'CameraViewAngle',30);
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

Answers (0)

Categories

Find more on Graphics Performance in Help Center and File Exchange

Products


Release

R2018a

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!