Ich führe eine Simulation in MATLAB durch, in der ich einen großen 3D-Datensatz habe, der sich bei jedem Zeitschritt ändert. Ich versuche, die Daten mithilfe eines 3D-Streudiagramms mit Punkten zu veranschaulichen, die im Verlauf der Simulation unterschiedliche Positionen, Größen, Farben und Transparenzstufen annehmen. Die Größen- und Farbinformationen sind redundant.Visualisierung eines großen 3D-Datensatzes mit Streudiagramm
Rendern und Drehen der Figur in MATLAB ist langsam und abgehackt. Mein Computer hat eine 4 GHz i7-4790 CPU und eine NVIDIA GeForce GTX 750 Ti Grafikkarte. Ich verwende Matlab R2016a unter Windows 7. Ich habe meine MATLAB OpenGL Einstellungen überprüft und der Hardware Support Level ist voll. (Hardware-OpenGL ist für die Transparenz notwendig.) Außerdem überwache ich meine GPU-Nutzung unter Verwendung von GPU-Z, und während des Plottens und der Drehung erreicht die GPU-Last nur 25-30%.
Hier ist mein Code Beispiel:
load sample_data2
channels_matrix = cat(1, channels{:});
num_channels = length(channels);
channel_lengths = cellfun(@(x) size(x, 1), channels);
figure(1);
for i = 1:num_channels
g = plot3(channels{i}(:, 1), channels{i}(:, 2), channels{i}(:, 3), 'k');
set(g, 'LineWidth', 1.5)
hold on;
text(channels{i}(1, 1), channels{i}(1, 2), channels{i}(1, 3), num2str(i))
end
caxis([0 1])
colorbar
drawnow
numDivisions = 8;
ptsPerDivision = numel(grid_x)/numDivisions;
T = 1000;
numplotpts = 2E4;
for t = 1:T
plot_signal = nan(size(grid_x));
plot_signal(sort(randsample(numel(grid_x), numplotpts))) =...
sort(rand(numplotpts, 1));
tic
for i = 1:numDivisions
temp = plot_signal(dists_idx((i-1)*ptsPerDivision+1:i*ptsPerDivision));
yplot = grid_y(dists_idx((i-1)*ptsPerDivision+1:i*ptsPerDivision));
xplot = grid_x(dists_idx((i-1)*ptsPerDivision+1:i*ptsPerDivision));
zplot = grid_z(dists_idx((i-1)*ptsPerDivision+1:i*ptsPerDivision));
if t == 1
h(i) = scatter3(yplot(~isnan(temp)), xplot(~isnan(temp)),...
zplot(~isnan(temp)), 50*temp(~isnan(temp)), temp(~isnan(temp)), ...
'filled', 'MarkerFaceAlpha', exp(-i)^0.25);
else
h(i).XData = yplot(~isnan(temp));
h(i).YData = xplot(~isnan(temp));
h(i).ZData = zplot(~isnan(temp));
h(i).SizeData = 50*temp(~isnan(temp));
h(i).CData = temp(~isnan(temp));
end
end
drawnow
toc
end
und hier ist ein Link auf die data. Gibt es eine Möglichkeit, das Rendering zu beschleunigen und die Rotation glatter zu machen? Mir ist aufgefallen, dass das Fixieren der Größe aller Datenpunkte auf einen einzelnen Skalar das Rendering und die Rotation erheblich beschleunigt. Ist es möglich, die Größe so zu halten, wie sie im Code enthalten ist, und die Figur trotzdem schnell rendern zu lassen?
Bearbeiten: A ich gepostet.
Braucht es in Echtzeit zu sein, oder können Sie es als Film (.avi) machen später für flüssigere Wiedergabe? – informaton
Echtzeit ist keine Voraussetzung, aber es wäre bevorzugt. –
Ich bekomme etwa 0,5 Sekunden Verzögerungen zwischen den Anrufen in Ihrem Code (z. B. Tic/Toc). Was bist du gerade? – informaton