Matlab绘制绕Y轴旋转球体出现压扁异常问题求助
问题解答
关于sphere(20)的坐标结构
sphere(n)生成的三个(n+1)×(n+1)矩阵,每个位置(i,j)对应的X(i,j)、Y(i,j)、Z(i,j)就是球体表面的单点坐标——本质是球面的参数化网格:
- 行索引
i对应极角(从北极到南极的纬度方向) - 列索引
j对应方位角(绕垂直轴的经度方向)
你可以用scatter3(X(:), Y(:), Z(:))验证,所有点都严格分布在半径为1的球面上,不存在复杂组合逻辑。
旋转后球体“压扁”的原因及解决方法
你看到的“压扁类球体”是视觉错觉,核心问题是Matlab默认的坐标轴缩放规则:surf绘图后,坐标轴会自动适配窗口大小,导致三个轴的单位长度在屏幕上比例不一致,看起来像被压扁。
解决步骤如下:
1. 确保旋转矩阵计算正确
绕Y轴旋转θ角的标准变换公式为:
rotX = X*cos(theta) + Z*sin(theta); rotY = Y; rotZ = -X*sin(theta) + Z*cos(theta);
避免逐点循环计算,直接用矩阵广播运算更高效且不易出错。
2. 强制坐标轴等比例显示
在绘图代码末尾添加axis equal,让X/Y/Z轴的单位长度在屏幕上保持一致,这是解决视觉压扁的关键。
修正后的完整代码示例
theta = deg2rad(23.5); % 地球自转轴倾斜角(23.5度) [X,Y,Z] = sphere(20); % 绕Y轴执行旋转变换 rotX = X*cos(theta) + Z*sin(theta); rotY = Y; rotZ = -X*sin(theta) + Z*cos(theta); figure; % 绘制旋转后的球体 surf(rotX, rotY, rotZ, 'EdgeColor', 'none'); hold on; % 绘制旋转后的赤道(原Z=0的圆变换后) phi = linspace(0, 2*pi, 100); eqX = cos(phi)*cos(theta); eqY = sin(phi); eqZ = -cos(phi)*sin(theta); plot3(eqX, eqY, eqZ, 'Color', [0.5 0 0.5], 'LineWidth', 2); % 绘制坐标轴(X轴红色) plot3([0 2], [0 0], [0 0], 'Color', 'r', 'LineWidth', 2); plot3([0 0], [0 2], [0 0], 'Color', 'g', 'LineWidth', 2); plot3([0 0], [0 0], [0 2], 'Color', 'b', 'LineWidth', 2); axis equal; % 强制坐标轴等比例,消除视觉压扁 grid on; view(3); % 切换到3D视图
运行这段代码后,你会看到正球体效果,赤道和坐标轴的显示也会符合预期。
内容的提问来源于stack exchange,提问作者simonc8
相关产品推荐
相关产品推荐

