← Назад к вопросам
Как выполнить поворот 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 обеспечивает удобство для сложных сценариев.