Rotazione automatica di un cubo

di il
3 risposte

Rotazione automatica di un cubo

Salve.
Per la mia prossima discussione di tesi ho avuto la necessità di realizzare un grafico su tre assi, di uguale lunghezza. Tramite il comando plot di Matlab, dopo aver importato come dati i valori dei tre parametri, sono riuscito a creare una nuvola di punti nell'area di questo cubo, con questo risultato.

A questo punto però dovrei realizzare un'animazione, ovvero far sì che questo cubo ruoti intorno al centro mostrando così tutte le sue faccie verticali una dopo l'altra, possibilmente in loop, così da presentarlo in sede di discussione, oppure in modo da poterlo registrare con un programma di screen recording (o esportarlo come avi).
Mi sapete dare dei consigli su come realizzare questa animazione? Sono praticamente del tutto a digiuno di Matlab, a parte quel poco che sono riuscito a fare.
Grazie

3 Risposte

  • Re: Rotazione automatica di un cubo

    Per ottenere un effetto di "animazione" puoi modificare progressivamente, all'interno di un loop il punti di vista del grafico.

    Il settaggio del "punto di vista" viene effettuato tramite la funzione "view": mantenendo fisso il valore dell'elevazione (secondo parametro) si ottiene una rotazione attorno all'asse verticale.

    E' possibile, a seconda dell'effetto di animazione che si vuole ottenere, modificare uno solo dei due parametri (Az o El) o anche tutti e due.

    Il passo del loop consente di regolare la velocità di rotazione.

    La chiamata alla funzione "pause" all'interno del loop consente di regolare la velocità di aggiornamento del grafico.

    Settando il limite superiore del loop ad un multiplo di 360, si ottengono più rotazioni.

    Nel corso della rotazione MatLab "aggiusta " automaticamente i "tick" degli assi ed il parametro "CameraViewAngle", entrambe queste regolazioni degradano (almeno secondo il mio punto di vista) l'effetto di animazione.

    Per evitare questi aggiustamenti automatici puoi settare manualmente tali parametri per mezzo della funzione "set".

    Di seguito uno script di esempio che illustra quanto suggerito.
    
    % Creazione dei punti di esempio
    pt=randi([100,200],10,3);
    % Plot dei punti di esempio
    plot3(pt(:,1),pt(:,2),pt(:,3),'o','markerfacecolor','r','markeredgecolor','r')
    grid on
    box
    daspect([1 1 1])
    % Identificazione dei limiti degli assi
    x_lim=get(gca,'xlim')
    y_lim=get(gca,'ylim')
    z_lim=get(gca,'zlim')
    % Settaggio manuale dei "tick" degli assi
    set(gca,'xtick',[x_lim(1):25:x_lim(2)])
    set(gca,'ytick',[y_lim(1):25:y_lim(2)])
    set(gca,'ztick',[z_lim(1):25:z_lim(2)])
    % Modifica del valore di CameraViewAngle: più è grando il valore, più
    % l'oggetto rappresentato sembra "lontano" questo evita che MatLab aggiusti
    % automaticamente le dimensinoi del sistem di assi cartesiani
    set(gca,'CameraViewAngle',[15])
    % Loop per la rotazione del grafico
    for i=1:5:660
       view(i,33)
       pause(.3)
    end
    
    Hope this helps.
  • Re: Rotazione automatica di un cubo

    E' chiaro, credo, ho provato a eseguire il codice ed è perfettamente quello che cercavo di ottenere.
    Ora però, perdona la mia inabilità con Matlab, io ho creato il plot 3D tramite il comando plot.
    Come faccio a inserire nel codice che tu mi hai mostrato le caratteristiche del mio cubo?
    Il file è un txt semplice che riporta i valori degli assi x, y e z:
    28900000000000000 27941 0.70766
    22500000000000000 34464 0.72238
    15300000000000000 27308 0.66309
    36300000000000000 33065 0.70145
    32200000000000000 33754 0.72999
    34500000000000000 29531 0.72709
    30100000000000000 29106 0.73557
    31300000000000000 31538 0.70772
    23600000000000000 28100 0.7205
    27300000000000000 23315 0.73156
    20400000000000000 25601 0.72201
    19800000000000000 29194 0.66575
    17100000000000000 22322 0.71522
    29100000000000000 20034 0.66897
    10300000000000000 16368 0.61974
    24600000000000000 17208 0.69858
    14900000000000000 17963 0.67632
    9270000000000000 16575 0.67904
    12900000000000000 16825 0.64572
    23600000000000000 19722 0.69366
    24200000000000000 25728 0.676
    Gli estremi di ogni asse sono però aggiustati per far tornare a metà di ogni asse il valore mediano della serie, quindi non posso usare il range di valori per ogni asse che viene assegnato in automatico.
    E' in questa parte di codice qui che devo inserire i miei parametri?
    % Creazione dei punti di esempio
    pt=randi([100,200],10,3);
    % Plot dei punti di esempio
    plot3(pt(:,1),pt(:,2),pt(:,3),'o','markerfacecolor','r','markeredgecolor','r')
    grid on
    box
    daspect([1 1 1])
    % Identificazione dei limiti degli assi
    x_lim=get(gca,'xlim')
    y_lim=get(gca,'ylim')
    z_lim=get(gca,'zlim')
    % Settaggio manuale dei "tick" degli assi
    set(gca,'xtick',[x_lim(1):25:x_lim(2)])
    set(gca,'ytick',[y_lim(1):25:y_lim(2)])
    set(gca,'ztick',[z_lim(1):25:z_lim(2)])
    Grazie del supporto, sei stato molto gentile.
  • Re: Rotazione automatica di un cubo

    Se hai già identificato un metodo per definire i limiti degli assi, dovrebbe essere sufficiente che tu inserisca le relative istruzioni all'interno del loop utilizzato per la rotazione.

    Rispetto al mio esempio, devi eliminare l'istruzione
    daspect([1 1 1])
    dal momento che, con i tuoi valori, i limiti degli assi sono molto diversi tra loro.

    Se riduci il passo del ciclo for, otterrai un movimento più fluido.
    figure('color',[1 1 1])
    pt=[28900000000000000	27941	0.70766
       22500000000000000	34464	0.72238
       15300000000000000	27308	0.66309
       36300000000000000	33065	0.70145
       32200000000000000	33754	0.72999
       34500000000000000	29531	0.72709
       30100000000000000	29106	0.73557
       31300000000000000	31538	0.70772
       23600000000000000	28100	0.7205
       27300000000000000	23315	0.73156
       20400000000000000	25601	0.72201
       19800000000000000	29194	0.66575
       17100000000000000	22322	0.71522
       29100000000000000	20034	0.66897
       10300000000000000	16368	0.61974
       24600000000000000	17208	0.69858
       14900000000000000	17963	0.67632
       9270000000000000	16575	0.67904
       12900000000000000	16825	0.64572
       23600000000000000	19722	0.69366
       24200000000000000	25728	0.676
       ];
    % Plot dei punti di esempio
    plot3(pt(:,1),pt(:,2),pt(:,3),'o','markerfacecolor','r','markeredgecolor','r')
    grid on
    box
    % % % daspect([1 1 1])
    % Settaggio dei limiti degli assi
    
    % Inserire qui
    
    % Identificazione dei limiti degli assi
    x_lim=get(gca,'xlim')
    y_lim=get(gca,'ylim')
    z_lim=get(gca,'zlim')
    % Identificazione dei tick degli assi
    x_tick=get(gca,'xtick')
    y_tick=get(gca,'ytick')
    z_tick=get(gca,'ztick')
    % Modifica del valore di CameraViewAngle: più è grando il valore, più
    % l'oggetto rappresentato sembra "lontano" questo evita che MatLab aggiusti
    % automaticamente le dimensinoi del sistem di assi cartesiani
    set(gca,'CameraViewAngle',[10])
    % Settaggio del colore degli assi
    set(gca,'color',[0.93 0.93 0.93])
    % Loop per la rotazione del grafico
    for i=1:1:660
       view(i,15)
       % Settaggio manuale dei limiti e dei "tick" degli assi
       set(gca,'xtick',x_tick)
       set(gca,'ytick',y_tick)
       set(gca,'ztick',z_tick)
       set(gca,'xlim',x_lim)
       set(gca,'ylim',y_lim)
       set(gca,'zlim',z_lim)
       pause(.1)
    end
    
    Hope this helps.
Devi accedere o registrarti per scrivere nel forum
3 risposte