2012-01-04 136 views
2

我有一个以球轴为原点的球体。我使用rotate3d函数来允许其旋转。但是,当我旋转它时,它似乎在具有旋转的固定点的空间中移动。我想将原点固定为旋转中心。我怎样才能实现它?在Matlab中围绕固定点的3D球体旋转

这里是我的代码:

function ex 
global state; 
fh = figure('Menu','none','Toolbar','none','Units','characters',... 
    'Renderer','OpenGL'); 
hPanAni = uipanel('parent',fh,'Units','characters','Position',... 
    [22.6 10.4 53 23],'title','Controls','FontSize',11,... 
    'FontAngle','italic','FontWeight','bold'); 
hIniAni = uicontrol(hPanAni,'Style','pushbutton','Units','normalized',... 
    'Position',[0.14 0.75 0.5 0.12],'String','Spin',... 
    'FontSize',10,'Callback',@hIniAniCallback); 
hFinAni = uicontrol(hPanAni,'Style','pushbutton','Units','normalized',... 
    'Position',[0.14 0.5 0.5 0.12],'String','Stop',... 
    'FontSize',10,'Callback',@hFinAniCallback); 
hResetAni = uicontrol(hPanAni,'Style','pushbutton','Units','normalized',... 
    'Position',[0.14 0.25 0.5 0.12],'String','Reset',... 
    'FontSize',10,'Callback',@hResetAniCallback); 
hPantSim = uipanel('Parent',fh,'Units','characters',... 
    'Position',[107.87 8 157.447 42],'BorderType','none','title',... 
    'Screen','FontSize',11,'FontAngle','italic',... 
    'FontWeight','bold'); 
hPantSimInt = uipanel('Parent',hPantSim,'Units','normalized','Position',... 
    [0 0 1 1],'BorderType','line','BackgroundColor','k'); 
axes('units','normalized','position',[0,0,1,1],'Parent',... 
    hPantSimInt); 
stars = rand(60,2); 
scatter(stars(:,1),stars(:,2),6,'y','Marker','+'); 
axis off; 
ah4 = axes('Parent',hPantSimInt,'Units','normalized','Position',... 
    [0 0 1 1],'Color','none','Visible','off','DataAspectRatio',... 
    [1 1 1],'NextPlot','add'); 
T1 = 0:pi/1000:2*pi; 
Fin = numel(T1); 
if (Fin>1000) 
    Incr = floor(Fin/1000); 
else 
    Incr = 1; 
end 
Y = zeros(numel(T1),3); 
Y(:,1) = 7000*cos(T1); 
Y(:,2) = 7000*sin(T1); 
R_esf = 6378; 
[x_esf,y_esf,z_esf] = sphere(50); 
x_esf = R_esf*x_esf; 
y_esf = R_esf*y_esf; 
z_esf = R_esf*z_esf; 
props.FaceColor= 'texture'; 
props.EdgeColor = 'none'; 
props.Parent = ah4; 
surface(x_esf,y_esf,z_esf,props); 
handles.psat = line('parent',ah4,'XData',Y(1,1), 'YData',Y(1,2),... 
    'ZData',Y(1,3),'Marker','o', 'MarkerSize',10,'MarkerFaceColor','b'); 
line([0 1.5*R_esf],[0 0],[0 0],'LineWidth',3,'Color','g'); 
line([0 0],[0 1.5*R_esf],[0 0],'LineWidth',3,'Color','g'); 
line([0 0],[0 0],[0 1.5*R_esf],'LineWidth',3,'Color','g'); 
pbaspect([1 1 1]); 
axis vis3d; 
rotate3d(ah4); 
view([atan2(Y(1,2),Y(1,1)),0]); 
az = 0; 
k = 2; 
ind_ini = 0; 
state = 0; 
     function hIniAniCallback(hObject,evt) 
      tic; 
      if (ind_ini == 1) 
       return; 
      end 
      ind_ini = 1; 
      state = 0; 
      while (k<=Fin) 
      set(handles.psat,'XData',Y(k,1),'YData',Y(k,2),'ZData',Y(k,3)); 
      pause(0.002); 
      if (k == Fin) 
       toc; 
      end 
      k = k + Incr; 

      if (state == 1) 
       state = 0; 
       break; 
      end 
      end 
     end 

    function hFinAniCallback(hObject,evt) 
     ind_ini = 0; 
     state = 1; 
    end 
function hResetAniCallback(hObject,evt) 
    set([handles.psat],'Visible','off'); 
    ind_ini = 0; 
    state = 1; 
    az = 0; 
    k = 2; 
    handles.psat = line('parent',ah4,'XData',Y(1,1), 'YData',Y(1,2),... 
    'ZData',Y(1,3),'Marker','o', 'MarkerSize',10,'MarkerFaceColor','b'); 
end 

end 
+1

你能澄清一下你的问题吗?目前尚不清楚你目前所描述的行为是什么,以及你希望取而代之的是什么。 – 2012-01-04 23:07:35

+0

我同意。也许你应该展示一些图片。 – Oli 2012-01-04 23:08:59

+0

谢谢你的评论。我刚刚添加了显示我的问题的代码。如果你用鼠标旋转球体,你会看到它随着它的移动而移动,甚至它看起来离开了屏幕窗口。我希望当我旋转球体时,这看起来像是固定的,剩下的物体在它周围移动。 – julian 2012-01-05 12:16:58

回答

1

的问题是,3D旋转相对于做你的轴的中心,而不是相对于原点。在轴上添加绿线之后,x,y,z轴的极限会自动更改,球体的中心不再位于图形的中心。绘制所有行后,添加以下行:

ax_limits = 2*[-R_esf R_esf]; 
set (ah4, 'xlim', ax_limits, 'ylim', ax_limits, 'zlim', ax_limits) 

'2'因子只是为了防止球体紧紧地填满你的轴。您可以将其设置为您需要的任何值。

+0

非常感谢您的回答。 – julian 2012-01-05 12:20:33