2012-01-04 35 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

少し質問を明確にすることはできますか?あなたの現在の記述がどんなふうに振る舞っているのか、あなたが何を代わりにしたいのかは不明です。 –

+0

私は同意します。たぶんあなたは写真をいくつか見せてください。 – Oli

+0

あなたのコメントをお寄せいただきありがとうございます。私はちょうど私の問題を示すコードを追加しました。マウスで球体を回転させると、動きに追従して移動し、画面の外に出ているように見えます。私は球を回転させると固定されたように見え、残りのオブジェクトはその周りを動き回ります。 – julian

答えて

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

関連する問題