Уравнения вращения играют фундаментальную роль в различных областях, включая компьютерную графику, робототехнику и физику. Понимание различных методов вращения необходимо для манипулирования и преобразования объектов в трехмерном пространстве. В этой статье мы рассмотрим несколько уравнений вращения и предоставим примеры кода для демонстрации их реализации. Давайте погрузимся!
- Углы Эйлера:
Углы Эйлера представляют собой вращения как три последовательных элементарных вращения вокруг фиксированных осей (обычно X, Y и Z). Следующий фрагмент кода демонстрирует, как выполнить поворот с использованием углов Эйлера:
import numpy as np
def euler_rotation(theta_x, theta_y, theta_z):
# Convert angles to radians
theta_x = np.radians(theta_x)
theta_y = np.radians(theta_y)
theta_z = np.radians(theta_z)
# Construct rotation matrices
rotation_x = np.array([[1, 0, 0],
[0, np.cos(theta_x), -np.sin(theta_x)],
[0, np.sin(theta_x), np.cos(theta_x)]])
rotation_y = np.array([[np.cos(theta_y), 0, np.sin(theta_y)],
[0, 1, 0],
[-np.sin(theta_y), 0, np.cos(theta_y)]])
rotation_z = np.array([[np.cos(theta_z), -np.sin(theta_z), 0],
[np.sin(theta_z), np.cos(theta_z), 0],
[0, 0, 1]])
# Combine rotations
rotation_matrix = rotation_z @ rotation_y @ rotation_x
return rotation_matrix
- Вращение кватернионов.
Кватернионы обеспечивают компактное представление вращения и позволяют избежать некоторых ограничений углов Эйлера, таких как блокировка карданного подвеса. Вот пример выполнения поворота с использованием кватернионов:
import numpy as np
from scipy.spatial.transform import Rotation
def quaternion_rotation(angle, axis):
# Convert angle to radians
angle = np.radians(angle)
# Normalize the axis vector
axis /= np.linalg.norm(axis)
# Create quaternion rotation object
r = Rotation.from_quat([axis[0]*np.sin(angle/2), axis[1]*np.sin(angle/2), axis[2]*np.sin(angle/2), np.cos(angle/2)])
# Convert to rotation matrix
rotation_matrix = r.as_matrix()
return rotation_matrix
- Матрицы вращения.
Матрицы вращения обеспечивают краткое представление вращения. Вот как можно реализовать поворот с помощью матриц:
import numpy as np
def matrix_rotation(theta, axis):
# Convert angle to radians
theta = np.radians(theta)
# Normalize the axis vector
axis /= np.linalg.norm(axis)
# Skew-symmetric cross-product matrix
K = np.array([[0, -axis[2], axis[1]],
[axis[2], 0, -axis[0]],
[-axis[1], axis[0], 0]])
# Construct rotation matrix
rotation_matrix = np.eye(3) + np.sin(theta) * K + (1 - np.cos(theta)) * (K @ K)
return rotation_matrix
- Представление оси-угла:
Представление оси-угла определяет вращение по оси и углу поворота. Вот пример реализации поворота с использованием представления угла оси:
import numpy as np
def axis_angle_rotation(angle, axis):
# Convert angle to radians
angle = np.radians(angle)
# Normalize the axis vector
axis /= np.linalg.norm(axis)
# Compute rotation matrix
rotation_matrix = np.eye(3) * np.cos(angle) + (1 - np.cos(angle)) * np.outer(axis, axis) + np.sin(angle) * skew_symmetric(axis)
return rotation_matrix
def skew_symmetric(v):
return np.array([[0, -v[2], v[1]],
[v[2], 0, -v[0]],
[-v[1], v[0], 0]])
В этой статье мы рассмотрели различные уравнения вращения и предоставили примеры кода для каждого метода. Углы Эйлера, вращения кватернионов, матрицы вращения и представление угла оси имеют свои преимущества и подходят для различных приложений. Понимая эти методы вращения, вы сможете эффективно манипулировать и трансформировать объекты в трехмерном пространстве. Поэкспериментируйте с этими фрагментами кода и включите их в свои проекты, чтобы воплотить в жизнь 3D-преобразования!