- 此问题在此处已有答案**:
How to rotate slices of a Rubik's Cube in python PyOpenGL?(1个答案)
8天前关闭。
这篇文章是编辑并提交审查8天前.
我有一个小问题使用3d旋转矩阵来实现一个rubiks立方体模拟器.我的问题是,当试图旋转我的立方体围绕全局x和y轴(在3d),我结束了旋转围绕全局x轴和立方体的y轴.例如,采取下一张图片作为起点:the original position
以下一张图片为例,当我试图通过向左移动鼠标来围绕y轴旋转时会发生什么:incorrectly rotating around the cube's y axis instead of the global y axis
下一张图片作为一个例子,当我试图通过向下移动鼠标绕x轴旋转时会发生什么:correctly rotating around the global x axis
在这里你可以看到我用来执行旋转的代码:
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
字符串
关于代码如何工作的额外上下文(尽管有点不必要),下面是我如何计算如何获得旋转Angular :
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级学生)
到目前为止,我已经尝试用旋转矩阵反转乘法器的顺序(一些网站展示了类似的解决方案),但非常相似的结果显示(只有一个轴围绕全局轴旋转,而其他轴围绕当前轴旋转)。
对于额外的信息,如果我的措辞是混乱的,我一直在寻找类型的旋转,它似乎被称为"外在"旋转(如果我不是worngly midtaken)
同样,我被认为是重复的问题有一个答案,这个答案没有讨论这些矩阵是如何工作的,也没有讨论如何旋转完整的立方体,以及较小的部分,我已经做过了。
1条答案
按热度按时间mwecs4sa1#
第二张图的信息量不是很大,但我认为问题在于立方体的中心不在
(0, 0, 0)
的位置上。旋转矩阵会相对于(0, 0, 0)
顶点旋转向量。wolfram alpha提供的更多信息example(但仅适用于2D)。
如果有问题,解决方法是移动矩阵。首先,您使用矩阵M_shify将立方体移动到其中心位于
(0, 0, 0)
的位置。然后使用矩阵旋转。然后使用反向移动矩阵(移动参数乘以-1)此外,对于矩阵乘法,最好使用matmul运算符
@
。对于2D矩阵,numpy.dot对于matmul运算符是等价的:
字符串
相当于
型