Matlab 3D绘图技巧:近地视图下显示远处太阳
问题描述
我在Matlab里绘制了地球及近地轨道的3D图,想要在正确位置添加太阳的显示,但绘制太阳表面图会导致整个视图被过度缩小。我需要在聚焦展示近地物体的同时,能在远处看到太阳。已知太阳相对地球(绘图原点)的位置,尝试缩放视图但效果极差,地球变得特别小,还没聚焦到地球就无法继续缩放了。
含太阳的绘图:
不含太阳的绘图:
绘图代码:
figure('Color','k'); %rotate3d; % Black background and planets %background('Black'); %hold on % Celestial bodies p3Dopts.Units = 'km'; %p3Dopts.RotAngle = 180; planet3D('Earth', p3Dopts); hold on %p3Dopts.Position = rSun(1,:)'; %planet3D('Sun', p3Dopts); % Flight path scatter3( Y(:,1), Y(:,2), Y(:,3), 6, scaledT) xlabel('x [km]'); ylabel('y [km]'); zlabel('z [km]'); ylim([-40000,40000]); title('Earth equatorial frame', 'FontSize', 14); cbar = colorbar; cbar.Color = 'w'; cbar.Title.Color = 'w'; cbar.Title.String = strcat('Time [',Tname,']'); clim([min(scaledT);max(scaledT)]) axis equal; grid on; ax = gca; ax.Color = 'k'; ax.GridColor = 'w'; ax.GridAlpha = 0.45; ax.XColor = 'w'; ax.YColor = 'w'; ax.ZColor = 'w'; hold off
解决方案
核心问题是太阳真实尺寸远大于地球和近地轨道范围,直接按真实比例绘制会强制视图缩放至包含太阳的超大范围,导致近地细节无法展示。可以用非真实比例的简化太阳表示,比如用一个高亮的大圆点或小型球体替代真实尺寸的太阳表面图,同时保持其正确的空间位置,这样既不影响近地视图的聚焦,又能显示太阳的位置。
修改后的代码示例
figure('Color','k'); % Celestial bodies p3Dopts.Units = 'km'; planet3D('Earth', p3Dopts); hold on % 方式1:用缩小版球体绘制太阳,手动设置适配近地视图的半径 p3Dopts_Sun = p3Dopts; p3Dopts_Sun.Position = rSun(1,:)'; % 太阳相对地球的位置 p3Dopts_Sun.Radius = 5000; % 远小于真实尺寸,可根据视图调整 planet3D('Sun', p3Dopts_Sun); % 方式2:用scatter3画高亮圆点,更轻便高效 % scatter3(rSun(1,1), rSun(1,2), rSun(1,3), 200, 'y', 'filled'); % Flight path scatter3( Y(:,1), Y(:,2), Y(:,3), 6, scaledT) xlabel('x [km]'); ylabel('y [km]'); zlabel('z [km]'); ylim([-40000,40000]); title('Earth equatorial frame', 'FontSize', 14); cbar = colorbar; cbar.Color = 'w'; cbar.Title.Color = 'w'; cbar.Title.String = strcat('Time [',Tname,']'); clim([min(scaledT);max(scaledT)]) axis equal; grid on; ax = gca; ax.Color = 'k'; ax.GridColor = 'w'; ax.GridAlpha = 0.45; ax.XColor = 'w'; ax.YColor = 'w'; ax.ZColor = 'w'; hold off
额外优化:锁定视图范围
如果添加太阳后视图仍自动缩放,可以在绘制完所有元素后添加以下代码锁定近地视图范围:
axis manual; xlim([-40000,40000]); ylim([-40000,40000]); zlim([-40000,40000]);
这样就能在保持近地细节清晰的同时,在远处显示太阳的位置了。
内容的提问来源于stack exchange,提问作者Michael Bay
相关产品推荐
相关产品推荐

