【发布时间】:2022-01-16 02:12:52
【问题描述】:
我无法让我的代码围绕其局部轴旋转 3D 对象以正常工作。我正在使用 Ursina 游戏引擎。我要旋转的 3D 对象扩展了 Entity 类,它有一个 rotation 属性,即欧拉角。我通过测试了解到 Ursina 按 Z、X、Y 顺序进行欧拉旋转——如果我错了,请纠正我。我在 Ursina 的文档中没有找到欧拉顺序。
import numpy as np
from scipy.spatial.transform import Rotation as R
from ursina import *
class FreeRotateEntity(Entity):
def __init__(self, **kwargs):
super().__init__(**kwargs)
def rotate(self, angles):
self.rotation = Vec3(*[360 + a if a < 0 else a for a in [
R.from_matrix(
np.matmul(
R.from_euler('zxy', (self.rotation.z, self.rotation.x, self.rotation.y), degrees=True).as_matrix(),
R.from_euler('zxy', [angles[i] for i in (2, 0, 1)], degrees=True).as_matrix()
)
).as_euler('zxy', degrees=True)[i] for i in (1, 2, 0)
]])
class Ship(FreeRotateEntity):
…
代码将对象的当前旋转矩阵与要应用的新旋转矩阵(围绕局部,而不是全局轴)相乘。它不能正确旋转。
我尝试交换矩阵乘法的顺序,更改欧拉顺序,并使用scipy.spatial.transform.Rotation.apply 代替矩阵乘法,但这些都不起作用。
我在rotate 方法中做错了什么?
【问题讨论】:
标签: python matrix rotation rotational-matrices ursina