Сохраняйте постоянное количество видимых кругов в 3D-анимации - PullRequest
5 голосов
/ 27 февраля 2020

Я создал 3D-анимацию с перспективной проекцией белых кругов, движущихся случайным образом в искусственном трехмерном пространстве, проецируемом на 2D-экран компьютера (GIF 1).

enter image description here

Поскольку мне нужно сохранить одинаковое количество видимых кругов, каждый раз, когда круг исчезает из рамки, я должен создать новый видимый круг в кадре. Для этого я написал этот фрагмент кода:

  • Сначала я создал начальные координаты и два угла движения (сферические координаты):

    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
    
    • Затем в l oop, который воспроизводит анимацию и обновляет положение каждого круга, я поставил это условие после того же ответа, который был дан на тот же тип вопроса здесь :

      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
      

Я получил странный результат, как показано в GIF 2

enter image description here

Что не так с моим состоянием и как я могу обнаружить круг, который исчезает из рамки, и воссоздать его внутри рамки?

1 Ответ

0 голосов
/ 05 марта 2020

Основываясь на опубликованном вами коде, я могу видеть только две точки интереса, не выполняя его на самом деле
(не могли бы вы добавить немного связующего кода вокруг кода, который вы разместили, чтобы сделать его работоспособным в качестве отдельного примера?)

  1. Вы только сбрасываете координаты x и y в условии if, вам также нужно сбросить z, иначе они будут лететь позади камеры или вани sh на расстоянии
  2. условие if из вопроса, который вы связали, имеет другую часть: sphere.position.z >= camera_z, которая переведет ваш код в circle.position.z <= near_z для фактического обнаружения сфер, летящих за камерой

Оба могут ' реально объяснить, что происходит во втором гифке ...


Подумав еще раз: прыгающие круги в гиф 2 могут быть просто кругами, которые мгновенно сбрасываются в каждом кадре, потому что они не сбрасываются должным образом, поскольку их координата z остается неизменной.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...