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)
根据您发布的代码,我只能看到两个兴趣点而没有实际运行它
(您可以在您发布的代码周围添加一些粘合代码以使其可以作为独立示例运行吗?)
sphere.position.z >= camera_z它将您的代码转换为circle.position.z <= near_z实际检测在相机后面飞行的球体两者都无法真正解释你的第二张 gif 中发生的事情......
再一想:gif 2 中的跳跃圆圈可能只是每帧立即重置的圆圈,因为它们没有正确重置,因为它们的 z 坐标保持不变。