在3D图中绘制远处对象,Matlab

u0sqgete  于 2022-12-27  发布在  Matlab
关注(0)|答案(2)|浏览(184)

我有一个绕地球轨道的3D图和地球本身的表面图。我也想在正确的位置看到太阳,但是如果我绘制太阳的表面图,图会缩小太多。我只想看到地球附近的物体,同时能够看到远处的太阳。你有什么建议吗?我有太阳相对于地球的位置。地球中心是情节的原点。pidoss.:我可以放大图,但结果还不够好。地球太小了,缩放在到达它之前就停止工作了。这是截至目前的图:

这是没有太阳的图:

以下是代码(仅打印):

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
3htmauhk

3htmauhk1#

ax = gca;  % Get the current axes object
ax.Projection = 'orthographic';
ax.CameraPosition = [0, 0, 1];  % Set the camera position to be above the plot

ax.XLim = [-40000, 40000];  % Set the x-axis range
ax.YLim = [-40000, 40000];  % Set the y-axis range
ax.ZLim = [-40000, 40000];  % Set the z-axis range
643ylb08

643ylb082#

我最终做了一个混合的解决方案。感谢@Marco,来自Stack Overflow的@Cris Luengo和来自Matlab论坛的@Karim。

  • r是相对于原点的摄影机位置,与其他位置一样。
  • dist是显示的立方体一边距离的一半。我决定使用基于人类水平FOV的轨道高度乘以tan(68º)。
  • rSun是太阳的位置矢量。
  • rMoon(也画了这个)是月球的位置矢量。

首先,我有一个太阳位置的无限光源,为了画一个像月亮这样的遥远的表面物体,我用一个特殊的rMoon2把它放在图的边缘,并把它的大小乘以一个比例数:

rMoon2 = rMoon/norm(rMoon)*dist
size = size*(dist-norm(r))/(norm(rMoon)-norm(r))

如果物体像太阳一样非常遥远,你可以去掉分母的r。
如果对象本身是光源(太阳),则需要在位于r的观察者和太阳之间的另一个光源(但为局部光源)。因此,除了前面的步骤之外,还需要:

localLightPos = rSun2*(1-2*tand(34/60)*(dist-norm(r))/dist))

其中2*tand(34/60)*(dist-norm(r)/dist)是相对于太阳和观察者之间距离的视太阳半径的两倍。
这里是整个代码的情节,如果你想要它。

r = Y(j,1:3);
dist = tand(68)*(norm(r)-Rearth);
figure('Color','k','Position');

% Celestial bodies
p3Dopts.Units = 'km';
p3Dopts.RotAngle = angleEarth(j);
planet3D('Earth', p3Dopts);
hold on
p3Dopts = rmfield(p3Dopts, 'RotAngle');
p3Dopts.Position = rSun(j,:)/norm(rSun(j,:))*dist';
relDist = 2.1*(dist-norm(r)); % 2.1 because the sun appears bigger than it is
p3Dopts.Size = relDist/norm(rSun(j,:));
planet3D('Sun', p3Dopts);
%Sunlight, apparent Sun is ~28-34 arc minutes near Earth
light("Style","infinite","Position",p3Dopts.Position)
light("Style","local","Position",p3Dopts.Position*(1-2*tand(34/60)*relDist/dist));
p3Dopts.Position = rMoon(j,:)/norm(rMoon(j,:))*dist';
p3Dopts.Size = relDist/norm(rMoon(j,:)-r);
planet3D('Moon', p3Dopts);
p3Dopts = rmfield(p3Dopts, 'Position');
p3Dopts = rmfield(p3Dopts, 'Size');
% Ground track
scatter3( trackT(1:j,1), trackT(1:j,2), trackT(1:j,3), 12, T(1:j), 'filled')
%xlabel('x [km]'); ylabel('y [km]'); zlabel('z [km]');
title('Earth focused animation');  
axis equal;
grid on;
ax = gca; ax.Color = 'k'; ax.GridColor = 'k';
ax.GridAlpha = 0; ax.XColor = 'k'; ax.YColor = 'k';
ax.ZColor = 'k';

ax.CameraPosition = r;  % Set the camera position
ax.XLim = [-dist, dist];  % Set the x-axis range
ax.YLim = [-dist, dist];  % Set the y-axis range
ax.ZLim = [-dist, dist];  % Set the z-axis range

相关问题