3D. Как Гарантировать, Что Случайно Сгенерированный Вектор Скорости Перемещает Камеру Вперед По Допустимой Дуге?

  • Автор темы Nelya
  • Обновлено
  • 22, Oct 2024
  • #1

Я создаю камеру в сцене, используя случайные координаты для

 camera_dir = (0, 0, 0) - current_cam_pos
while True:

vel_vec=[uniform(-max_vel, max_vel), uniform(-max_vel, max_vel)] # generate a random velocity vector

new_pos = camera_dir + vel_vec # compute a new position (and camera direction vector) for the camera

if (compute_angle(new_pos, camera_dir) < 45 or compute_angle(new_pos, camera_dir) > 315):

break 
 
and 0 и настройка z and orient the camera so that it looks on the point (0, 0, 0). My goal is to move the camera forward using randomly-generated velocity vectors on the ground (so z=0 остается y ). I want to ensure that the new position of the camera is within a valid range after moving it forward, defined in degrees with respect to the current focus point/direction. More specifically, the way I determine "valid range" is by ensuring that the new position is within 45 degrees of the old camera's focus point (-45 degrees to the left and +45 degrees to the right). Can someone write a pseudocode on how I can achieve this?

Вот моя попытка сделать это, но, похоже, это неправильный способ помочь мне достичь того, чего я хочу:

x

#3d #2d #камера #физика

Nelya


Рег
12 Jan, 2021

Тем
74

Постов
197

Баллов
587
  • 26, Oct 2024
  • #2

Что-то вроде этого должно работать:

 camera_dir 

Некоторые примечания:

  • forward_direction will blow up due to a division by 0 if your camera position is ever (0,0,0), so you may want to check for that case and use a default direction value instead.
  • Это также усложняется, если ваша камера движется по оси Z: трюк (y, -x) для выбора right_direction only works in a 2D plane.
  • Это не заботится о наведении камеры обратно в исходное положение, поскольку в вашем примере кода не упоминается, как это работает в вашей системе, поэтому после одного перемещения вам придется повторить это для normalize (or forward_direction = normalize(-current_cam_pos) right_direction = (forward_direction.y, -forward_direction.x, 0) angle = uniform(-pi/4, pi/4) new_direction = (cos(angle) * forward) + (sin(angle) * right) new_pos = new_direction * how_far_you_want_to_move в вашем примере) расчет правильный.
 

DendWiliedyYY


Рег
10 Jun, 2010

Тем
77

Постов
177

Баллов
602
Тем
403,760
Комментарии
400,028
Опыт
2,418,908

Интересно