Поворот куба с использованием матрицы вращения в vpython

Я просто делаю куб в vpython, у которого есть какая-то опция, например, изменить положение, повернуть по оси X, Y или Z. Но проблема в том, что я на самом деле не знаю, как вращать куб, используя матрицу вращения, которая обычно используется в математике. Я сделал правильную математику, но я не уверен, как дать свой результат свойствам куба, вращающимся по оси X. Я попытался передать вектор, который является результатом математики, свойству куба, называемому осью, но это не то, чего я на самом деле хочу, я также попытался использовать свойство pos, но это не так. Я только что работал с вращением по оси X. Кроме того, чтобы это было правильно, сначала я всегда меняю положение, затем я пытался сделать поворот.

Не могли бы вы мне помочь?

Вот мой код:

from visual import *
from visual.controls import *
from math import *
from numpy import *

positionGlobalX=0
positionGlobalY=0
positionGlobalZ=0
def changeActualPosition(figure):
    global positionGlobalX
    global positionGlobalY
    global positionGlobalZ
    posX=input("X: ")
    posY=input("Y: ")
    posZ=input("Z: ")
    positionGlobalX=posX
    positionGlobalY=posY
    positionGlobalZ=posZ
    figure.pos=(posX,posY,posZ)


def rotateX(figure):
    global positionGlobalX
    global positionGlobalY
    global positionGlobalZ
    degrees=input("How many degrees: ")
    radians=pi*degrees/180
    posActual=array([[positionGlobalX],[positionGlobalY],[positionGlobalZ]])
    mX=array([[1,0,0],[0,cos(radians),-sin(radians)],[0,sin(radians),cos(radians)]])
    mXm=matrix(mX)
    posActualM=matrix(posActual)
    result=mXm*posActualM
    inX=float(result[0][0])
    inY=float(result[1][0])
    inZ=float(result[2][0])
    print inX
    print inY
    print inZ
    figure.axis=(inX,inY,inZ)
    #figure.rotate(angle=radians,axis=figure.axis, origin=figure.pos)



scene=display(title="Rotation",x=0, y=0, width=600, height=600,cinter=(2*pi,pi,pi))
figure = box(pos=(0,0,0), axis=(2,0,0),make_trail=True,material=materials.earth, length=4, height=5, width=6)

b1 = button(pos=(0,70), height=30, width=100, text='Change position', action=lambda: changeActualPosition(figure))
b2 = button(pos=(0,40), height=30, width=100, text='Rotation X', action=lambda: rotateX(figure))
b3 = button(pos=(0,10), height=30, width=100, text='Rotation Y', action=lambda: changeActualPosition(figure))
b4 = button(pos=(0,-20), height=30, width=100, text='Rotation Z', action=lambda: changeActualPosition(figure))
b5 = button(pos=(0,-50), height=30, width=100, text='Traslation', action=lambda: changeActualPosition(figure))

Извините за мой английский. И спасибо за вашу помощь.

0 ответов

Другие вопросы по тегам