使用Java AWT在2D画布渲染3D物体时的渲染异常排查求助
问题根因排查
你的代码核心错误出在透视投影计算逻辑,一共2个关键问题:
- 缩放因子计算错误
你当前投影函数里的缩放因子写法是:
这里分母多乘了一次float scaleProjected = FIELD_OF_VIEW / (FIELD_OF_VIEW * z);FIELD_OF_VIEW,相当于缩放因子直接变成了1/z,完全不符合透视投影的计算逻辑。正确的透视缩放因子应该是视场值/(视场值 + 顶点z坐标)。 - 坐标系适配错误
Java AWT画布的Y轴是从上到下递增的,和3D空间常用的Y轴向上坐标系完全相反,投影后没有翻转Y坐标会导致渲染结果上下颠倒。
另外还要补充边界判断,避免z值过小导致除以0或者反向投影的问题。
修复方案参考
修正后的投影函数
public v project(float x, float y, float z){ // 避免z值过小导致除0或者反向投影 if(FIELD_OF_VIEW + z <= 0) return null; float scaleProjected = FIELD_OF_VIEW / (FIELD_OF_VIEW + z); float xProjected = (x * scaleProjected) + PROJECTION_CENTER_X; // 翻转Y轴适配AWT坐标系 float yProjected = PROJECTION_CENTER_Y - (y * scaleProjected); return new v(xProjected, yProjected, scaleProjected); }
渲染逻辑补充空判断
在调用投影函数后增加空校验,避免空指针异常:
v v1Project = project(v1.x, v1.y, v1.z); v v2Project = project(v2.x, v2.y, v2.z); // 任意顶点投影失败就跳过当前线段渲染 if(v1Project == null || v2Project == null) continue;
修改完成后即可正常渲染出带透视效果的3D立方体。
内容的提问来源于stack exchange,提问作者GDjkhp
相关产品推荐
相关产品推荐

