3D动画透视投影显示所有球体失败

Failed to display all the spheres in perspetive projection of 3D animation

我生成了一个光流动画,其中球体(圆圈)在 3D 坐标 space 中朝向观察者移动。出于某种原因,虽然我定义了8个球体,但每次我 运行 代码时它都不会显示所有球体;有时它显示 1,有时显示 4(就像在 gif 中一样)。最终是1到8个球体的随机数

我的代码在 Github

上可用

透视投影时,视体积为frustum。因此,球体可能在平截头体的两侧被剪裁(不在平截头体中),尤其是当它们靠近近平面时。
请注意,大多数恒星 "leave" window 在其边界处,当它们靠近相机时(除了那些,它们通过近平面离开平截头体)。

出于调试原因,将球体的初始 z 坐标设置为其最大值(远平面):

for sphere in spheres:
    sphere.position.xy = np.random.uniform(-25, 25, size=2)
    #sphere.position.z = np.random.uniform(0.0, -50.0)
    sphere.position.z = 50

如果您根本 "see" 不是所有星星,那么 x 和 y 坐标 ([-25, 25]) 的范围就太大了。

为了补偿初始裁剪,您可以按距离缩放 x 和 y 分量:

for sphere in spheres:
    sphere.position.xy = np.random.uniform(-25, 25, size=2)
    z = np.random.uniform(0.0, -50.0)
    sphere.position.z = z
    sphere.position.xy[0] *= z/-50
    sphere.position.xy[1] *= z/-50