Scratch中3D视角程序旋转问题:对象沿X/Z轴挤压变形
Scratch 3D视角旋转挤压变形问题解决思路
问题根源
你用的是2D平面旋转公式,但3D视角下的旋转需要结合Z轴深度和透视投影,直接套用2D旋转会忽略深度对视觉大小的影响,导致旋转时出现X/Z轴方向的挤压变形。
正确的3D旋转与投影步骤
使用对应轴的3D旋转公式
针对不同旋转轴,用专门的3D旋转公式计算旋转后的3D坐标,而非2D公式:- 绕Y轴(左右旋转):
x' = x * cosθ - z * sinθ z' = x * sinθ + z * cosθ y' = y - 绕X轴(俯仰旋转):
y' = y * cosθ - z * sinθ z' = y * sinθ + z * cosθ x' = x
这里的(x,y,z)是原始3D坐标,θ是旋转角度,计算后得到旋转后的3D坐标(x',y',z')。
- 绕Y轴(左右旋转):
添加透视投影转换
旋转完成后,需要将3D坐标转换为Scratch舞台的2D屏幕坐标,加入透视效果避免变形:screen_x = (x' * 焦距) / z' + 舞台中心X screen_y = (y' * 焦距) / z' + 舞台中心Y焦距可以设为200-400之间的数值(根据视觉效果调整),舞台中心X/Y一般是Scratch舞台的中点(比如480x360舞台就是240,180)。
关于列表使用的问题
你之前尝试第二个列表时出现的疑似4D问题,大概率是因为混淆了原始3D坐标、旋转后3D坐标和屏幕2D坐标的存储。正确的做法是:
- 用一个列表存储所有物体的原始3D坐标(比如每个项目存"x,y,z"格式)
- 旋转时,遍历原始坐标列表,计算得到旋转后的3D坐标,存入第二个列表
- 最后基于旋转后的3D坐标列表计算屏幕坐标,用于在舞台绘制
不要在屏幕坐标上重复执行旋转计算,也不要让不同阶段的坐标互相覆盖,否则会出现逻辑混乱。
额外注意
- 限制Z轴的最小值(比如z' > 50),避免Z轴接近0时透视公式导致物体异常放大
- 所有旋转计算都要基于3D坐标完成,再做投影,不要颠倒顺序
内容的提问来源于stack exchange,提问作者Collin Carter
相关产品推荐
相关产品推荐

