Как выпустить луч под определённым углом в трехмерном пространстве?

Вот пример в 2D:

def ray(x, y, angle, step):
    new_x = x + sin(angle) * step
    new_y = y + cos(angle) * step
    return new_x, new_y

Ответы (1 шт):

Автор решения: MarianD

В 3D будут фигурировать 2 угла - я не буду их называть angle и angle2, а использую для них знакомые имена azimuth и zenith (угол между осью z):

def ray(x, y, z, azimuth, zenith, step):
    new_x = x + sin(zenith) * cos(azimuth) * step
    new_y = y + sin(zenith) * sin(azimuth) * step
    new_z = z + cos(zenith) * step
    return new_x, new_y, new_z

т.к. ваш угол angle в плоскости xy я переименовал на azimuth и проекция вектора в плоскость xy будет иметь длину sin(zenith) * step.


Когда вы вместо угла между осей z хотите угол между плоскостью ху (elevation), примените:

def ray(x, y, z, azimuth, elevation, step):
    new_x = x + cos(elevation) * cos(azimuth) * step
    new_y = y + cos(elevation) * sin(azimuth) * step
    new_z = z + sin(elevation) * step
    return new_x, new_y, new_z

введите сюда описание изображения


Примечание:

В вашем примере angle - угол от оси y, в моем ответе azimuth - от оси x, как видно на картинке.

В случае необходимости поменяйте местами cos(azimuth) и sin(azimuth), чтобы получить правильные функции для азимута от оси y.

→ Ссылка