3D вращение с неправильными осями вращенияPython

Программы на Python
Anonymous
3D вращение с неправильными осями вращения

Сообщение Anonymous »

У меня возникла небольшая проблема с использованием 3D-матриц вращения для реализации симулятора кубика Рубика. Моя проблема в том, что при попытке повернуть куб вокруг глобальных осей X и Y (в 3D) я в конечном итоге вращаюсь вокруг
глобальной оси X и оси Y куба. например, возьмите следующее изображение в качестве отправной точки: исходное положение
возьмите следующее изображение в качестве примера того, что происходит, когда я пытаюсь повернуть вокруг оси Y, перемещая мышь к слева: неправильное вращение вокруг оси Y куба вместо глобальной оси Y
и следующее изображение в качестве примера того, что происходит, когда я пытаюсь повернуть вокруг оси X, перемещая мышь вниз: правильное вращение вокруг глобальной оси X
здесь вы можете увидеть код, который я использовал для выполнения вращения:

Код: Выделить всё

from math import cos,sin
import numpy as np
def rotate(mat,xangle,yangle,zangle):  #these angles are by how much i want to rotate around a certain                   axis (in radians)
xrotation_matrix = np.matrix([[1,0,0],
[0,cos(xangle),-sin(xangle)],
[0,sin(xangle),cos(xangle)]])
yrotation_matrix = np.matrix([[cos(yangle),0,sin(yangle)],
[0,1,0],
[-sin(yangle),0,cos(yangle)]])
zrotation_matrix = np.matrix([[cos(zangle),-sin(zangle),0],
[sin(zangle),cos(zangle),0],
[0,0,1]])
rotated3d = np.dot(zrotation_matrix,mat.reshape((3,1)))  #mat is a point in the form np.matrix([x,y,z])
rotated3d = np.dot(yrotation_matrix,rotated3d)
rotated3d = np.dot(xrotation_matrix,rotated3d)
return rotated3d
для дополнительного контекста (хотя и немного ненужного) о том, как работает код, вот как я рассчитываю, как получить углы поворота:

Код: Выделить всё

def get_full_turn(self,mousepos):
xchange = mousepos[0]-self.startdrag[0]
ychange = mousepos[1]-self.startdrag[1]
self.xangle -= self.xadding
self.yangle -= self.yadding
self.xadding = ychange/100
self.yadding = xchange/100
self.xangle += self.xadding
self.yangle += self.yadding
Как мне заставить куб вращаться вокруг глобальной оси X и глобальной оси Y, чтобы я мог правильно его вращать?
(пожалуйста, объясните очень просто, поскольку я просто увлечен, но очень новый студент A-level)
до сих пор я пытался изменить порядок умножения с помощью матриц вращения (некоторые веб-сайты показали нечто подобное в качестве решения), но результаты были очень похожими (только 1 ось вращается вокруг глобальной оси, а остальные - вокруг текущей оси).
для получения дополнительной информации, если моя формулировка сбивает с толку, я искал тип вращения, и кажется называться «внешней» ротацией (если я не запутался)
кроме того, вопрос, который я должен дублировать, имеет один ответ. и в этом ответе не рассматривается, как работают эти матрицы, и не рассматривается способ вращения ПОЛНОГО куба, а также более мелких частей, которые я уже сделал.

Подробнее здесь: https://stackoverflow.com/questions/774 ... ion-axises

Вернуться в «Python»