Есть ли функция (и) matlab, которую я могу использовать для создания реалистичной диаграммы МКС? - PullRequest
0 голосов
/ 15 апреля 2019

В рамках проекта, который я сейчас предпринимаю, я должен решить проблему двух тел международной космической станции, вращающейся вокруг Земли. До сих пор мне удалось приблизиться к этому, используя функцию сферы / прибоя, однако мне было интересно, есть ли способ создать более реалистичную фигуру, представляющую МКС? К сожалению, этот проект должен быть выполнен исключительно через MATLAB, поэтому я не могу использовать другие инструменты, которые могут обеспечить лучшую визуализацию

1 Ответ

2 голосов
/ 15 апреля 2019

НАСА имеет 3D-модели многих объектов, включая МКС, , которые можно найти здесь .Этот файл может быть преобразован в STL, как вы хотите, я нашел этот случайный веб-сайт , который работал для меня.

В Matlab вы можете прочитать в этом файле через

stl = stlread('isscombined.stl');
V = stl.Points;
F = stl.ConnectivityList

Затем вы можете построить его, используя

p = patch('vertices',V,'faces',F,'FaceColor',[.8 .8 .8]);

, и затем вы можете обновить объект новыми позициями вершин, когда станция вращается вокруг Земли.Очевидно, вы также можете масштабировать объект, умножая вершины на некоторое количество.Если вы не хотите, чтобы грани фасета были нанесены, вы также можете добавить 'EdgeAlpha', 0 к вашим patch опциям.

Вот простой пример, который показывает вращение МКС вокруг сферы

% Note: not to scale
ISS_radius = 2; % distance from center of Earth
RE = 1; % radius of earth
theta = 0:.05:2*pi;
x = ISS_radius*cos(theta);
y = ISS_radius*sin(theta);

stl = stlread('isscombined.stl');
r = .01; % scaling factor
V = stl.Points * r;
V = V - mean(V); % center at origin
F = stl.ConnectivityList;

figure; hold on;
plot3(x,y,zeros(numel(theta)),'--');
[X,Y,Z] = sphere(50);
surf(RE*X,RE*Y,RE*Z,'FaceColor',[0 0 .8],'EdgeAlpha',0);
p = patch('Vertices', V*r, 'Faces', F, 'FaceColor', [0 0 0], 'EdgeAlpha', 0);
axis equal;
set(gca,'View',[200 13])
grid on;
counter = 1;
while true
    p.Vertices = V + [x(counter), y(counter), 0];
    pause(0.01);
    drawnow
    counter = mod(counter + 1, numel(theta)) + 1;
    axis([-1 1 -1 1 -1 1]*ISS_radius*1.2)
end
...