← Назад к вопросам

Как выполнить поворот 3D-точек на 30 градусов вокруг одной из осей координат?

2.4 Senior🔥 101 комментариев
#Python Core#Другое

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI22 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Поворот 3D-точек вокруг осей координат

Для поворота трёхмерных точек используются матрицы поворота (rotation matrices). Каждая ось координат имеет свою матрицу поворота.

Матрицы поворота

Поворот вокруг оси X на угол θ:

Rx(θ) = | 1      0       0    |
        | 0   cos(θ)  -sin(θ) |
        | 0   sin(θ)   cos(θ) |

Поворот вокруг оси Y на угол θ:

Ry(θ) = | cos(θ)   0   sin(θ) |
        |   0      1      0    |
        | -sin(θ)  0   cos(θ) |

Поворот вокруг оси Z на угол θ:

Rz(θ) = | cos(θ)  -sin(θ)   0 |
        | sin(θ)   cos(θ)   0 |
        |   0        0      1 |

Реализация с NumPy

Это самый удобный способ для работы с несколькими точками:

import numpy as np

# Точка (x, y, z)
point = np.array([1, 2, 3])

# Угол поворота в градусах
angle_degrees = 30
angle_radians = np.radians(angle_degrees)

# Матрица поворота вокруг оси X
Rx = np.array([
    [1, 0, 0],
    [0, np.cos(angle_radians), -np.sin(angle_radians)],
    [0, np.sin(angle_radians), np.cos(angle_radians)]
])

# Применяем поворот
rotated_point = Rx @ point
print(rotated_point)

Работа с несколькими точками

import numpy as np

# Несколько точек (каждая строка — одна точка)
points = np.array([
    [1, 0, 0],
    [0, 1, 0],
    [0, 0, 1]
])

angle_degrees = 30
angle_radians = np.radians(angle_degrees)

# Матрица поворота вокруг оси Z
Rz = np.array([
    [np.cos(angle_radians), -np.sin(angle_radians), 0],
    [np.sin(angle_radians), np.cos(angle_radians), 0],
    [0, 0, 1]
])

# Поворот всех точек сразу
rotated_points = points @ Rz.T
print(rotated_points)

Удобные функции для каждой оси

import numpy as np

def rotate_x(points, angle_degrees):
    """Поворот вокруг оси X"""
    angle = np.radians(angle_degrees)
    c, s = np.cos(angle), np.sin(angle)
    rotation_matrix = np.array([
        [1, 0, 0],
        [0, c, -s],
        [0, s, c]
    ])
    return points @ rotation_matrix.T

def rotate_y(points, angle_degrees):
    """Поворот вокруг оси Y"""
    angle = np.radians(angle_degrees)
    c, s = np.cos(angle), np.sin(angle)
    rotation_matrix = np.array([
        [c, 0, s],
        [0, 1, 0],
        [-s, 0, c]
    ])
    return points @ rotation_matrix.T

def rotate_z(points, angle_degrees):
    """Поворот вокруг оси Z"""
    angle = np.radians(angle_degrees)
    c, s = np.cos(angle), np.sin(angle)
    rotation_matrix = np.array([
        [c, -s, 0],
        [s, c, 0],
        [0, 0, 1]
    ])
    return points @ rotation_matrix.T

# Использование
points = np.array([[1, 2, 3], [4, 5, 6]])
rotated = rotate_z(points, 30)
print(rotated)

Использование scipy.spatial.transform

Для более сложных операций используйте встроенный инструмент:

from scipy.spatial.transform import Rotation
import numpy as np

points = np.array([[1, 2, 3]])

# Поворот на 30 градусов вокруг оси Z
rotation = Rotation.from_rotvec([0, 0, np.radians(30)])
rotated_points = rotation.apply(points)
print(rotated_points)

Комбинированные повороты

Для последовательных поворотов вокруг нескольких осей:

from scipy.spatial.transform import Rotation
import numpy as np

points = np.array([[1, 0, 0]])

# Поворот на 30° вокруг X, затем 45° вокруг Y
rotation = Rotation.from_rotvec([
    np.radians(30),  # вокруг X
    np.radians(45),  # вокруг Y
    0                # вокруг Z
])
rotated_points = rotation.apply(points)
print(rotated_points)

Нумерационный способ простой и эффективен для работы с множеством точек, а scipy обеспечивает удобство для сложных сценариев.

Как выполнить поворот 3D-точек на 30 градусов вокруг одной из осей координат? | PrepBro