2014-07-11 10 views
6

Ich versuche, eine rotierende Kugel in Matlab zu animieren, aber die Beleuchtung auf der Kugel dreht sich damit. Ich möchte stattdessen, dass sich die Kugel dreht, während die Beleuchtung mit dem Koordinatensystem fixiert bleibt. Hier ist ein gif von dem, was mein Code gerade produziert: Animation. Und hier ist mein Code:Beleuchtung bleibt mit animierter Oberfläche 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

Ich bin mir nicht sicher, ob ich Ihre Anfrage verstehe. Wenn sich eine Kugel um ihre eigene Mitte dreht und die Farben (oder der Lichteffekt) still bleiben, dann gibt es keine Animation mehr. Wenn Sie nicht wollen, dass Sie Kontinente und Ozeane wollen, später hinzugefügt, um sich zu drehen? Andernfalls müssen Sie einige Farbwerte beibehalten (= hell) und einige andere Farbwerte (= Kontinente und Ozeane) drehen und für jedes Bild beide falten (multiplizieren). – Wli

+1

@Wli Die Frage scheint besser zu sein: "Warum scheint das im absoluten Koordinatensystem bei '[1 1 1] gesetzte Lichtobjekt mit der Kugel zu rotieren. Tatsächlich wird Rotate nur für das Kugelobjekt, nicht für das Lichtobjekt genannt ". Ich habe die Position des Lichts in der Schleife überprüft, es ändert sich nie. Also, für das Gute oder für das Schlechte scheint es, dass Matlab die Lichteffekte nach dem Aufruf zum Drehen nicht aktualisiert (was nicht intuitiv ist). – CitizenInsane

+3

Scheint, es könnte ein Problem mit der Oberfläche 'VertexNormals' nicht zu aktualisieren sein. http://www.mathworks.co.uk/matlabcentral/fileexchange/35210-rotate-m-function-fixed – nkjt

Antwort

1

Wie bereits in den Kommentaren erwähnt:

Scheint, als ob es ein Problem mit der Oberfläche sein könnte VertexNormals nicht Aktualisierung.

Die Lösung war, die rotate.m function fixed File Exchange Einreichung zu downloaden.

Die Beschreibung:

Bug Beweis:

[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° 

Es sieht aus wie das Licht bewegt hat. Dies ist auf einen Fehler in rotate.m Funktion zurückzuführen. Die "VertexNormals" -Eigenschaft des Surf-Objekts ist nicht aktualisiert als "xdata", "ydata" und "zdata" -Eigenschaften sind.

Dies ist in der eingereichten Version von rotate.m behoben.