在 3D 动画中保持恒定数量的可见圆圈

Kat*_*hia 8 python opengl 3d animation

我创建了一个 3D 动画,其中白色圆圈的透视投影在投影在 2D 计算机屏幕 (GIF 1) 上的假 3D 空间中随机移动。

在此处输入图片说明

由于我需要保持相同数量的可见圆圈,每次一个圆圈从框架中消失时,我都必须在框架内创建一个新的可见圆圈。为此,我编写了这段代码:

  • 首先我创建了初始坐标和两个运动角度(球坐标):

    for circle in circles:
    
        circle.position.xy = np.random.uniform(-25, 25, size=2)
        z = np.random.uniform(near_z, far_z)
    
        circle.position.z = z
        circle.position.x *= z/-50
        circle.position.y *= z/-50
    
        circle.theta_deg = np.random.rand(1) * 360
        circle.phi_deg = np.random.rand(1) * 360
    
        theta_rad = circle.theta_deg * np.pi / 180
        phi_rad = circle.phi_deg* np.pi / 180
    
    
        circle.dx = speed * np.sin(-phi_rad - theta_rad) / frameRate
        circle.dy = -speed * np.cos(phi_rad + theta_rad) / frameRate
        circle.dz = -speed * np.cos(theta_rad) / frameRate
    
    Run Code Online (Sandbox Code Playgroud)
    • 然后,在播放动画,并更新各圆的位置的循环,我已经把下面这是同一类问题提供了同样的回答这个条件在这里

      max_dist = max(abs(circle.position.x),abs(circle.position.y))
      limit_dist = 25 * abs((circle.position.z-near_z) / far_z)
      
      z_rel = np.random.uniform(near_z,far_z)
      
      if max_dist > limit_dist: 
          circle.position.x = np.random.uniform(-25, 25) * z_rel/far_z
          circle.position.y = np.random.uniform(-25, 25) * z_rel/far_z
      
      Run Code Online (Sandbox Code Playgroud)

我得到了一个奇怪的结果,如 GIF 2 所示

在此处输入图片说明

我的情况有什么问题,如何检测从框架中消失的圆圈并在框架内重新创建一个圆圈?

按照@Fabian N.(答案如下)的建议,我将 z 坐标以及 x 和 y 坐标重置如下:

    max_dist   = max(abs(circle.position.x), abs(circle.position.y))        # Find maximum distance of a circle to the center of the view:
    limit_dist = 25 * abs((circle.position.z-near_z) / far_z)


    if circle.position.z <= near_z or max_dist > limit_dist:

        z_rel = np.random.uniform(near_z,far_z) 
        circle.position.z = z_rel + near_z

        circle.position.x = np.random.uniform(-25, 25) * z_rel/far_z
        circle.position.y = np.random.uniform(-25, 25) * z_rel/far_z
Run Code Online (Sandbox Code Playgroud)

我得到了这个结果: 在此处输入图片说明

Fab*_* N. 0

根据您发布的代码,我只能看到两个兴趣点而没有实际运行它
(您可以在您发布的代码周围添加一些粘合代码以使其可以作为独立示例运行吗?)

  1. 你只是在if条件下重置x和y位置,你也需要重置z,否则,它们会飞到相机后面或消失在远处
  2. 您链接的问题中的 if 条件还有另一部分:sphere.position.z >= camera_z它将您的代码转换为circle.position.z <= near_z实际检测在相机后面飞行的球体

两者都无法真正解释你的第二张 gif 中发生的事情......


再一想:gif 2 中的跳跃圆圈可能只是每帧立即重置的圆圈,因为它们没有正确重置,因为它们的 z 坐标保持不变。