2014-07-11 21 views
6

Sto tentando di animare una sfera rotante in Matlab, tuttavia l'illuminazione della sfera ruota con essa. Io invece voglio che la sfera ruoti mentre l'illuminazione rimane fissa con il sistema di coordinate. Ecco un gif di ciò che il mio codice sta attualmente producendo: Animation. E qui è il mio codice:Illuminazione soggiorni con superficie animata in Matlab

% Simulation Time 
dt = 0.05; 
time = 0:dt:5; 

% Prep Figure 
figure('Color',[1 1 1],'Renderer','zbuffer','ColorMap', [1,0,0; 0,0,1]) 

% Generate Sphere 
[X,Y,Z] = sphere(20); 
r = 0.75*25.4; 
h = surf(r*X,r*Y,r*Z,Z,'FaceColor','interp'); 
hold on 

% Adjust Axes, Lighting, and Shading 
axis equal 
view([40 25]); 
light('Position',[1 1 1]) 
set(findobj(gca,'type','surface'),... 
      'FaceLighting','phong',... 
      'AmbientStrength',.3,'DiffuseStrength',.8,... 
      'SpecularStrength',.9,'SpecularExponent',25,... 
      'BackFaceLighting','unlit','EdgeColor','k') 

filename = 'Rotation.gif'; 
for n = 1:36 

     rotate(h,[0 0 1],10,[0 0 0]) 
     im = frame2im(getframe(1)); 
     [imind,cm] = rgb2ind(im,256); 

     if n == 1; 
      imwrite(imind,cm,filename,'gif', 'Loopcount',inf,'DelayTime',dt); 
     else 
      imwrite(imind,cm,filename,'gif','WriteMode','append','DelayTime',dt); 
     end 

end 
+0

Non sono sicuro di aver compreso la richiesta. Se una sfera gira attorno al suo centro e i colori (o l'effetto della luce) rimangono fermi, non c'è più animazione. A meno che non intendi che vuoi continenti e oceani, aggiunti in seguito, per girare? Altrimenti è necessario mantenere alcuni valori di colore ancora (= luce) e ruotare alcuni altri valori di colore (= continenti e oceani) e per ciascuna immagine che si convolgono (moltiplicare) entrambi. – Wli

+1

@Wli La domanda sembra essere la seguente: "Perché l'oggetto luminoso impostato nel sistema di coordinate assoluto su [1 1 1]" sembra ruotare con la sfera, infatti ruotare è chiamato solo per l'oggetto sfera, non per l'oggetto luce ". Ho controllato la posizione della luce nel circuito, non cambia mai. Quindi, per il bene o per il male, sembra che Matlab non stia aggiornando gli effetti di luce dopo la chiamata a ruotare (che non è intuitiva). – CitizenInsane

+3

Sembra che potrebbe essere un problema con la superficie 'VertexNormals' non si sta aggiornando. http://www.mathworks.co.uk/matlabcentral/fileexchange/35210-rotate-m-function-fixed – nkjt

risposta

1

Come già accennato nei commenti:

sembra che potrebbe essere un problema con la superficie VertexNormals non aggiornamento.

La soluzione era scaricare l'invio rotate.m function fixed File Exchange.

La descrizione:

Bug prove:

[x,y,z] = sphere(20); 
hs=surf(x,y,z,'facecolor','y'); 
view(2) 
axis equal 
hl=light; 
lightangle(hl,0,0) 
% light is on -Y axis, thus at the 
% bottom 
rotate(hs,[0 0 1],30) 
% rotate sphere to the right from 30° 

Sembra che la luce si è spostato. Ciò è dovuto a un bug nella funzione rotate.m . La proprietà "VertexNormals" dell'oggetto surf non è aggiornata come proprietà "xdata", "ydata" e "zdata".

Questo è stato risolto nella versione inoltrata di rotate.m.