numpy 旋转轴错误的3D旋转[重复]

kzipqqlq  于 2023-11-18  发布在  其他
关注(0)|答案(1)|浏览(118)
    • 此问题在此处已有答案**:

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)
同样,我被认为是重复的问题有一个答案,这个答案没有讨论这些矩阵是如何工作的,也没有讨论如何旋转完整的立方体,以及较小的部分,我已经做过了。

mwecs4sa

mwecs4sa1#

第二张图的信息量不是很大,但我认为问题在于立方体的中心不在(0, 0, 0)的位置上。旋转矩阵会相对于(0, 0, 0)顶点旋转向量。
wolfram alpha提供的更多信息example(但仅适用于2D)。
如果有问题,解决方法是移动矩阵。首先,您使用矩阵M_shify将立方体移动到其中心位于(0, 0, 0)的位置。然后使用矩阵旋转。然后使用反向移动矩阵(移动参数乘以-1)
此外,对于矩阵乘法,最好使用matmul运算符@
对于2D矩阵,numpy.dot对于matmul运算符是等价的:

rotated3d = np.dot(zrotation_matrix,mat.reshape((3,1)))
    rotated3d = np.dot(yrotation_matrix,rotated3d)
    rotated3d = np.dot(xrotation_matrix,rotated3d)

字符串
相当于

rotated3d = zrotation_matrix @ yrotation_matrix @ xrotation_matrix @ rotated3d

相关问题