Matlab如何实现任意数量3D子图视角同步联动旋转

实现方案
通过给所有3D子图绑定视角属性变化的监听回调,即可实现任意数量子图的旋转同步:当拖拽任意一个子图改变视角时,回调会自动读取当前交互子图的方位角、仰角参数,同步更新到其余所有子图上。
完整可运行代码如下,基于提供的示例修改:
[t p]=meshgrid(deg2rad(0:2:180),deg2rad(-180:2:180)); x=sin(t).*cos(p); y=sin(t).*sin(p); z=cos(t); F1=cos(t+pi/6).^2; F2=cos(t+2*pi/6).^2; F3=cos(t+3*pi/6).^2; % 创建画布,收集所有子图的坐标轴句柄 f = figure; ax_list = []; % 第一个子图 ax1 = subplot(1,3,1,'Parent',f); surf(ax1,x,y,z,F1,'EdgeColor','none') axis(ax1,'vis3d') ax_list = [ax_list, ax1]; % 第二个子图 ax2 = subplot(1,3,2,'Parent',f); surf(ax2,x,y,z,F2,'EdgeColor','none') axis(ax2,'vis3d') ax_list = [ax_list, ax2]; % 第三个子图 ax3 = subplot(1,3,3,'Parent',f); surf(ax3,x,y,z,F3,'EdgeColor','none') axis(ax3,'vis3d') ax_list = [ax_list, ax3]; % 给所有子图绑定视角变化监听 for ax = ax_list addlistener(ax, 'View', 'PostSet', @(src,evt) sync_view(ax_list, evt.AffectedObject)); end % 视角同步函数 function sync_view(ax_list, active_ax) % 获取当前正在交互的子图视角参数 [az, el] = view(active_ax); % 遍历所有子图同步视角,跳过当前交互的子图避免循环触发 for ax = ax_list if ax ~= active_ax view(ax, az, el); end end end
注意事项
- 该方案适配任意数量的3D子图,不管是几行几列的布局,只需要把新建的子图坐标轴句柄追加到
ax_list数组中即可自动生效 - 必须给每个子图设置
axis vis3d,否则旋转过程中会出现坐标轴比例拉伸、形变的问题 - 监听逻辑会同时响应鼠标拖拽旋转、代码修改视角两种场景,不需要额外写交互判断逻辑
内容的提问来源于stack exchange,提问作者berala
相关产品推荐
相关产品推荐

