Matlab中球体绕定点的三维旋转

Matlab中球体绕定点的三维旋转,matlab,3d,rotation,Matlab,3d,Rotation,我有一个以轴的原点为中心的球体。我使用rotate3d函数来允许其旋转。然而,当我旋转它时,它似乎在空间中移动,有一个固定的旋转点。我想将原点固定为旋转中心。我怎样才能做到呢 这是我的密码: function ex global state; fh = figure('Menu','none','Toolbar','none','Units','characters',... 'Renderer','OpenGL'); hPanAni = uipanel('parent',fh,'Uni

我有一个以轴的原点为中心的球体。我使用rotate3d函数来允许其旋转。然而,当我旋转它时,它似乎在空间中移动,有一个固定的旋转点。我想将原点固定为旋转中心。我怎样才能做到呢

这是我的密码:

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
函数ex
全球国家;
fh=图形('菜单','无','工具栏','无','单位','字符',。。。
“渲染器”、“OpenGL”);
hPanAni=uipanel('parent',fh,'Units','characters','Position',。。。
[22.6 10.4 53 23],“标题”,“控件”,“字体大小”,11,。。。
“字体角度”、“斜体”、“字体权重”、“粗体”);
hIniAni=uicontrol(hPanAni、‘样式’、‘按钮’、‘单位’、‘标准化’、,。。。
“位置”、[0.14 0.75 0.5 0.12]、“字符串”、“旋转”、,。。。
‘FontSize’、10、‘Callback’、@hIniAniCallback);
hFinAni=uicontrol(hPanAni、‘样式’、‘按钮’、‘单位’、‘标准化’、,。。。
“位置”、[0.14 0.5 0.5 0.12]、“字符串”、“停止”、,。。。
“FontSize”、10、“Callback”、“hFinAniCallback”);
hResetAni=uicontrol(hPanAni、‘样式’、‘按钮’、‘单位’、‘标准化’、,。。。
“位置”、[0.14 0.25 0.5 0.12]、“字符串”、“重置”、,。。。
“FontSize”、10、“Callback”、@hResetAniCallback);
hPantSim=uipanel('Parent',fh,'Units','characters',。。。
‘位置’、[107.87 8 157.447 42]、‘边界类型’、‘无’、‘标题’、,。。。
'屏幕','FontSize',11,'FontAngle','italic',。。。
“字体权重”、“粗体”);
HPANTSIMNT=uipanel('Parent',hPantSim,'Units','normalized','Position',。。。
[0 0 1 1],'BorderType','line','BackgroundColor','k');
轴('units'、'normalized'、'position'、[0,0,1,1]、'Parent'、,。。。
hPantSimInt);
星=兰特(60,2);
散布(星(:,1),星(:,2),6,'y','Marker','+');
轴断开;
ah4=轴('Parent',hPantSimInt,'Units','normalized','Position',。。。
[0 0 1 1]、“颜色”、“无”、“可见”、“关闭”、“DataAspectRatio”和,。。。
[1]、'NextPlot'、'add');
T1=0:pi/1000:2*pi;
Fin=numel(T1);
如果(Fin>1000)
增量=地板(Fin/1000);
其他的
增量=1;
结束
Y=零(numel(T1),3);
Y(:,1)=7000*cos(T1);
Y(:,2)=7000*sin(T1);
R_esf=6378;
[x_-esf,y_-esf,z_-esf]=球体(50);
x_esf=R_esf*x_esf;
y_esf=R_esf*y_esf;
z_esf=R_esf*z_esf;
props.FaceColor='纹理';
props.EdgeColor='none';
props.Parent=ah4;
表面(x_esf、y_esf、z_esf、道具);
handles.psat=line('parent',ah4,'XData',Y(1,1),'YData',Y(1,2),。。。
‘ZData’、Y(1,3)、‘Marker’、‘o’、‘MarkerSize’、10、‘MarkerFaceColor’、‘b’;
线条([01.5*R_esf]、[0 0]、[0 0]、'LineWidth',3、'Color','g');
线([0 0],[0 1.5*R_esf],[0 0],“线宽”,3,'Color','g');
行([0 0]、[0 0]、[0 1.5*R_esf]、'LineWidth',3、'Color','g');
pbaspect([1]);
轴vis3d;
旋转3d(ah4);
视图([atan2(Y(1,2),Y(1,1)),0]);
az=0;
k=2;
ind_ini=0;
状态=0;
功能HININICALLBACK(hObject,evt)
抽搐;
如果(ind_ini==1)
返回;
结束
ind_ini=1;
状态=0;

虽然(k问题是3d旋转是相对于轴的中心进行的,而不是相对于原点。沿轴添加绿线后,x、y、z轴的限制将自动更改,球体的中心不再位于图形的中心。在绘制所有lin后添加以下线es:

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

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

你能澄清一下你的问题吗?目前还不清楚你目前描述的行为是什么,以及你希望它是什么。我同意。也许你应该展示一些图片。谢谢你们两位的评论。我我刚刚添加了显示我的问题的代码。如果你用鼠标旋转球体,你会看到它随着它的移动而移动,甚至它似乎会从屏幕窗口消失。我希望当我旋转球体时,这看起来是固定的,其余的对象会围绕它移动。非常感谢你的回答。