scipyμ Rotation ν΄λμ€λ 3D 곡κ°μμμ νμ λ³νμ λ€λ£¨λ λ° μ¬μ©λλ€. νμ μ λνλ΄λ νλ ¬λ‘λΆν° νμ μ μννκ±°λ, νμ μ λνλ΄λ μΆκ³Ό κ°λλ₯Ό μ¬μ©νμ¬ νμ μ μνν μ μμ΄μ 3D geometryλ₯Ό λ€λ£° λ ν΄λΉ ν΄λμ€λ₯Ό μμ£Ό μ¬μ©νκ³ μλ€.
κ·Έ μ€μλ Rotation.apply() λ©μλλ₯Ό μμ£Ό μ¬μ©νλλ°, μ΄ λ©μλλ νμ λ 벑ν°λ₯Ό λ°ννλ€.
ν΄λΉ λ©μλμ κΈ°λ₯μ 벑ν°μ νμ νλ ¬μ κ³±νλ κ²μ΄λ©°, μμμ μΌλ‘λ μμ κ°μ΄ κΈ°μ‘΄ 벑ν°μ νμ νλ ¬(R)μ κ³±νλ κ²κ³Ό κ°λ€. νμ νλ ¬μ 벑ν°μ κ³±ν¨μΌλ‘μ¨ νμ λ 벑ν°λ₯Ό μ»μ μ μλ€.
Rotation.inv().apply() λ₯Ό μ¬μ©νλ©΄ νμ νλ ¬μ μνλ ¬μ 벑ν°μ μ μ©νμ¬ νμ νλ ¬μ λ°λλ°©ν₯μΌλ‘ νμ μν¬ μλ μλ€.
μ½λ μμ
from scipy.spatial.transform import Rotation as R
import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
# μ€μΌλ¬ κ° (yaw, pitch, roll) μ μ (λΌλμ λ¨μ)
yaw = np.pi / 4 # z μΆμ κΈ°μ€μΌλ‘ νμ νλ κ°λ (yaw)
pitch = np.pi / 6 # y μΆμ κΈ°μ€μΌλ‘ νμ νλ κ°λ (pitch)
roll = np.pi / 3 # x μΆμ κΈ°μ€μΌλ‘ νμ νλ κ°λ (roll)
# μ€μΌλ¬ κ°μ νμ κ°μ²΄λ‘ λ³ν
rot = R.from_euler('zyx', [yaw, pitch, roll])
# νμ μ μ μ©ν λ²‘ν° μ μ
vec = [0.1, 0, 0]
# νμ μ μ©
rotated_vec = rot.apply(vec)
# μκ°νλ₯Ό μν μ€λΉ
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
# μλ 벑ν°λ₯Ό μκ°ν
ax.quiver(0, 0, 0, vec[0], vec[1], vec[2], color='b', label='Original Vector')
# νμ λ 벑ν°λ₯Ό μκ°ν
ax.quiver(0, 0, 0, rotated_vec[0], rotated_vec[1], rotated_vec[2], color='r', label='Rotated Vector')
# μΆ λ μ΄λΈ μΆκ°
ax.set_xlabel('X')
ax.set_ylabel('Y')
ax.set_zlabel('Z')
# λ²λ‘ μΆκ°
ax.legend()
# κ·Έλν μΆλ ₯
plt.show()
- μ€μΌλ¬ κ°μ μ¬μ©νμ¬ λ²‘ν°λ₯Ό νμ νλ μμ μ½λ
- scipy.spatial.transform.Rotation ν΄λμ€μ from_euler() λ©μλλ₯Ό μ¬μ© - μ€μΌλ¬ κ°μ νμ κ°μ²΄λ‘ λ³ν
- apply() λ©μλλ₯Ό μ¬μ©νμ¬ νμ μ μ μ©ν 벑ν°μ νμ μ μ μ©