You need to enable JavaScript to run this app. 自研3D引擎沿Z轴旋转45度时立方体出现变形如何解决
优惠活动
大模型
产品
解决方案
定价
更多

自研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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.20 18:06:02