2014-07-11 6 views
6

Matlab에서 회전하는 구의 애니메이션을 만들려고하지만 구형의 조명이 함께 회전합니다. 필자는 구가 좌표계로 고정 된 채로 회전하는 동안 구를 원합니다. 여기 내 코드가 현재 생산하고있는 GIF가 있습니다 : Animation.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

귀하의 요청을 이해할 수 있는지 확실하지 않습니다. 구체가 자체 중심에서 회전하고 색상 (또는 조명 효과)이 계속 유지되면 더 이상 애니메이션이 없습니다. 나중에 추가되는 대륙과 대양을 원한다는 뜻이 아니라면? 그렇지 않으면 어떤 색상 값을 계속 (= 밝게) 유지하고 다른 색상 값 (= 대륙과 대양)을 회전시키고 각 이미지에 대해 둘 다 convoluate (multiplicate)해야합니다. – Wli

+1

@Wli 더 나은 질문 인 것 같습니다 : "[1 1 1]에서의 절대 좌표계에서 설정된 조명 객체가 구와 함께 회전하는 이유는 무엇입니까? 실제로 회전은 광원 객체가 아닌 구 객체에 대해서만 호출됩니다 ". 루프의 위치를 ​​확인 했으므로 절대 바뀌지 않습니다. 그럼, 좋은 또는 나쁜, matlab에 빛을 업데이 트하지 않는 것 같습니다 (직관적이지 않습니다) 회전 호출 후. – CitizenInsane

+3

'VertexNormals' 서페이스가 업데이트되지 않는 문제가있는 것처럼 보입니다. http://www.mathworks.co.uk/matlabcentral/fileexchange/35210-rotate-m-function-fixed – nkjt

답변

1

이미 코멘트에서 언급 한 : 그것은 표면 VertexNormals하지 업데이트에 문제가있을 수 있습니다처럼

이 보인다 그리고 여기 내 코드입니다.

해결책은 rotate.m function fixed File Exchange 제출을 다운로드하는 것이 었습니다.

설명 :

버그 증거 :

빛이 이동 한 것 같습니다
[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° 

. 이것은 rotate.m 기능의 버그로 인한 것입니다. 서핑 개체의 "VertexNormals"속성이 "xdata", "ydata"및 "zdata"속성으로 업데이트 된 이 아닙니다.

제출 된 rotate.m 버전에서 수정되었습니다.