3D立方体多轴旋转形态失真问题求助
多轴旋转时立方体形态失真的问题排查与修复
问题根源分析
你的旋转函数存在两个核心问题,导致多轴旋转时形态失真:
直接修改输入点坐标,后续旋转误用中间值
旋转过程中你直接修改了传入的g对象的x/y/z值,后续旋转步骤错误地使用了这些已被修改的中间坐标。比如绕X轴旋转后修改了g.y和g.z,绕Y轴旋转时却用这个被修改后的g.z计算,而非原始点的z坐标,彻底打乱了旋转叠加逻辑。
另外SPOT spot = g;只是引用赋值,并非复制对象,spot和g指向同一个实例,修改g后spot的值同步变化,导致后续计算全是被污染的数据。旋转公式符号与逻辑错误
你写的绕Y轴、Z轴的旋转公式符号不符合标准3D旋转矩阵逻辑。比如右手坐标系下绕Y轴旋转的z坐标计算,正确公式应为:z' = -x * sinθ + z * cosθ但你的代码里写成了
sy * (spot.x - this.center.x) - cy * (spot.z - this.center.z),符号完全搞反,旋转方向错误,多轴叠加后形态自然失真。
修复后的旋转函数示例
public SPOT RotatePoint(SPOT g) { // 转换角度为弧度,计算正余弦值 double rx = Math.toRadians(this.rotation.x); double ry = Math.toRadians(this.rotation.y); double rz = Math.toRadians(this.rotation.z); double sx = Math.sin(rx), cx = Math.cos(rx); double sy = Math.sin(ry), cy = Math.cos(ry); double sz = Math.sin(rz), cz = Math.cos(rz); // 1. 将点转换到以center为原点的局部坐标系 double x = g.x - this.center.x; double y = g.y - this.center.y; double z = g.z - this.center.z; // 2. 分步应用旋转(顺序:X→Y→Z,可按需调整) // 绕X轴旋转 double y1 = cx * y - sx * z; double z1 = sx * y + cx * z; // 绕Y轴旋转(修正公式符号) double x1 = cy * x + sy * z1; double z2 = -sy * x + cy * z1; // 绕Z轴旋转 double x2 = cz * x1 - sz * y1; double y2 = sz * x1 + cz * y1; // 3. 转换回原坐标系,返回新对象避免修改原数据 SPOT result = new SPOT(); result.x = x2 + this.center.x; result.y = y2 + this.center.y; result.z = z2 + this.center.z; return result; }
关键修复点说明
- 保留原始坐标:把原始点坐标提取为局部变量,所有旋转计算基于这些值的分步结果,避免污染输入对象。
- 修正旋转公式:按照标准3D旋转矩阵调整公式符号,确保旋转方向和计算逻辑正确。
- 返回新对象:创建新的
SPOT对象存储旋转结果,不修改传入的原始点,避免影响其他依赖原始数据的逻辑。
内容的提问来源于stack exchange,提问作者Valtsuh
相关产品推荐
相关产品推荐

