自研3D引擎沿Z轴旋转45度时立方体出现变形如何解决
问题根因
- 核心计算逻辑错误:代码计算旋转后的Y坐标时,使用了已经被更新过的X坐标值,不符合Z轴旋转的标准计算规则。标准Z轴旋转需要基于旋转前的原始X、Y坐标计算新坐标,你在修改v.x之后直接用新的v.x值计算v.y,直接导致坐标计算结果错误,出现变形。
- 隐藏风险:直接修改原始顶点数据的实现方式,会导致多次变换后出现浮点数累积误差,长期运行也会出现物体变形的问题。
修复方案
最直接的修复方式是先暂存旋转前的原始X、Y坐标,再分别计算新坐标值,修复后的代码如下:
public void rotate(vec3 r) { rotation.add(r); float sinZ = (float) Math.sin(Math.toRadians(r.z)); float cosZ = (float) Math.cos(Math.toRadians(r.z)); for (int vdx = 0; vdx < vertices.size(); vdx++) { vec3 v = vertices.get(vdx); // 暂存原始坐标 float originX = v.x; float originY = v.y; v.x = originX * cosZ - originY * sinZ; v.y = originY * cosZ + originX * sinZ; vertices.set(vdx, v); } }
后续优化建议
- 后续拓展多轴旋转、组合变换功能时,建议使用4x4变换矩阵统一处理平移、旋转、缩放逻辑,比分开计算三种变换效率更高,也更容易避免逻辑错误。
- 建议保留原始顶点数据不变,每次渲染时通过变换矩阵计算出当前帧的实际顶点坐标再提交渲染,避免多次变换带来的浮点数精度损失导致的物体变形。
内容的提问来源于stack exchange,提问作者Christopher Hosken
相关产品推荐
相关产品推荐

