Как рассчитать кватернион при вращении по оси X / Y / Z - PullRequest
2 голосов
/ 12 октября 2019

На рисунке ниже показана человеческая кость.

  • Красный - это кость / объект (плечевая кость / кость на вашем бицепсе)
  • Оранжевый - это ось X
  • Фиолетовый - ось Y
  • Розовый - ось Z

3D View of bone

Если текущая позиция кости 0.0101834 0.038481 -0.0018027 0.9992058 (в том же положении, что и на картинке выше), и я хочу повернуть кость по оси Z (розовая) на +60 градусов (таким образом, вращая кость к нам). Какими будут новые значения кватернионов (без искажения объекта, сохраняющего тот же масштаб)?

Таким образом, кость выглядит примерно так:

Rotated on the Z axis

Тот же вопрос применим, если я хочу повернуть по осям X и Y, какими будут значения кватерниона для кости.

Примечание: Каждое значение в кватернионе находится в диапазоне от -1 до 1


class Bone():
    def __init__(p3, p2, p1, p0):
        self.p3 = p3
        self.p2 = p2
        self.p1 = p1
        self.p0 = p0

    # Degrees = number between -360 and 360
    #           amount to rotate from current bone position
    def rotate_on_x(self, degrees):
        self.p3 = 
        self.p2 =
        self.p1 =
        self.p0 =

    # Degrees = number between -360 and 360
    #           amount to rotate from current bone position
    def rotate_on_y(self, degrees):
        self.p3 = 
        self.p2 =
        self.p1 =
        self.p0 =

    # Degrees = number between -360 and 360
    #           amount to rotate from current bone position
    def rotate_on_z(self, degrees):
        self.p3 = 
        self.p2 =
        self.p1 =
        self.p0 =

# Below are some values I found online but
# unsure how they even calculated it

# No rotation at all
no_rotation1 = Bone(0, 0, 0, -1)
no_rotation2 = Bone(0, 0, 0, 1)

# 90 degree rotation on X
90_degree_x_rotation1 = Bone(-0.707, 0, 0, -0.707)
90_degree_x_rotation2 = Bone(0.707, 0, 0, 0.707)

# 180 degree rotation on x
180_degree_x_rotation1 = Bone(-1, 0, 0, 0)
180_degree_x_rotation2 = Bone(1, 0, 0, 0)

# 270 degree rotation on x
180_degree_x_rotation1 = Bone(0.707, 0, 0, -0.707)
180_degree_x_rotation2 = Bone(-0.707, 0, 0, 0.707)

# 90 degree rotation on Y
90_degree_y_rotation = Bone(0, -0.707, 0, -0.707)

# 180 degree rotation on Y
180_degree_y_rotation = Bone(0, -1, 0, 0)

# 270 degree rotation on Y
270_degree_y_rotation = Bone(0, 0.707, 0, 0)

# 90 degree rotation on Z
90_degree_z_rotation = Bone(0, 0, -0.707, -0.707)

# 180 degree rotation on z
180_degree_z_rotation = Bone(0, 0, -1, 0)

# 270 degree rotation on Z
270_degree_z_rotation = Bone(0, 0, 0.707, -0.707)
...