Python turtle开发3D体素渲染引擎视角翻转时出现Y轴镜像渲染错误
问题修复方案
核心问题根源
- 未做相机后方物体剔除:当旋转角度使得物体位于相机后方时,3D转2D透视计算中的
transz参数变为负数,透视除法后坐标整体符号反转,直接导致画面出现Y轴镜像效果 - 坐标系适配错误:turtle默认屏幕坐标系与3D空间的Y轴方向未做适配,放大了镜像异常
- 冗余的绘制逻辑:立方体绘制代码存在重复坐标点调用,无功能影响但会增加无效计算
修复步骤
1. 重写goto3d投影函数,增加后方剔除与坐标系适配
def goto3d(x,y,z): rotxx=x rotxy=y*cos(xrot)-z*sin(xrot) rotxz=y*sin(xrot)+z*cos(xrot) rotyx=rotxx*cos(yrot)+rotxz*sin(yrot) rotyy=rotxy rotyz=rotxz*cos(yrot)-rotxx*sin(yrot) rotzx=rotyx*cos(zrot)-rotyy*sin(zrot) rotzy=rotyx*sin(zrot)+rotyy*cos(zrot) rotzz=rotyz transx=rotzx-xoff transy=rotzy-yoff transz=rotzz-zoff # 剔除相机后方的所有点,避免负数z导致投影反转 if transz <= 0: pencolor('black') return newx=fov*transx/transz # 调整Y轴符号适配turtle屏幕坐标系,解决镜像问题 newy=-fov*transy/transz # 超出视口范围的点跳过绘制 if newx<=-200 or newy<=-200 or newx>=200 or newy>=200: pencolor('black') return goto(newx,newy)
2. 清理cube函数的冗余绘制代码
删除cube函数中两处重复的goto3d调用,修改后的立方体绘制逻辑如下:
def cube(x,y,z): z-=100 pu() goto3d((-1+x)-camx,(-1+y)-camy,(-1+z)-camz) pd() goto3d((-1+x)-camx,(1+y)-camy,(-1+z)-camz) goto3d((1+x)-camx,(1+y)-camy,(-1+z)-camz) goto3d((1+x)-camx,(-1+y)-camy,(-1+z)-camz) goto3d((-1+x)-camx,(-1+y)-camy,(-1+z)-camz) pu() goto3d((-1+x)-camx,(1+y)-camy,(-1+z)-camz) pd() goto3d((-1+x)-camx,(1+y)-camy,(1+z)-camz) goto3d((1+x)-camx,(1+y)-camy,(1+z)-camz) goto3d((1+x)-camx,(1+y)-camy,(-1+z)-camz) pu() goto3d((-1+x)-camx,(-1+y)-camy,(-1+z)-camz) pd() goto3d((-1+x)-camx,(-1+y)-camy,(1+z)-camz) goto3d((1+x)-camx,(-1+y)-camy,(1+z)-camz) goto3d((1+x)-camx,(-1+y)-camy,(-1+z)-camz) pu() goto3d((-1+x)-camx,(1+y)-camy,(1+z)-camz) pd() goto3d((-1+x)-camx,(-1+y)-camy,(1+z)-camz) pu() goto3d((1+x)-camx,(1+y)-camy,(1+z)-camz) pd() goto3d((1+x)-camx,(-1+y)-camy,(1+z)-camz)
修改完成后即可解决旋转360度时的Y轴镜像异常,同时不会影响原有操作逻辑与渲染性能。
内容的提问来源于stack exchange,提问作者Tri Angular
相关产品推荐
相关产品推荐

