如何避免魔方锁在魔方

我正在制作一个魔方程序。 这将模拟魔方。 我有万向节锁的问题。 我需要知道如何避免它。 据我的理解,我可以乘以特定的顺序x,y,z旋转matrix来获得我想要得到的旋转。 或者,我可以使用四元数,就像围绕单个用户定义的轴而不是x,y或z轴旋转一样。 我无法真正了解如何从其他两个轴获得结果轴。 (x,y,z)如何从我的欧拉旋转中得到我的四元数轴? 会不会再造成万向locking?

其中一个大问题是。 我不知道要做什么轮换。 我需要把它变成一般用途。

编辑:我的问题更多的文档:

我的欧拉matrix乘法看起来像这样

rotate = XMMatrixRotationX(content.mesh[meshToRotate[i]].rotation.x) * XMMatrixRotationY(content.mesh[meshToRotate[i]].rotation.y) * XMMatrixRotationZ(radians); content.mesh[meshToRotate[i]].rotation.z = radians; 

由于万向节锁将暗示旋转中的最后一个轴出现问题。 当您尝试旋转前面或后面时,会出现问题。

在这里输入图像描述

在这样的拼图的情况下,你可以animation旋转,然后重新设置模型回到原来的位置,但立方体的贴纸旋转。

看看它像一个真正的难题通过移动贴纸作弊。

你将不得不改变贴纸的颜色。 这可以用材质颜色或dynamic纹理来完成。

这样你就可以把它缩小到2个animation:中心90'旋转和结束90'旋转。

您可以翻转/旋转立方体和贴图以在另一端或不同的轴上进行animation制作,反转animation以向另一个方向旋转。

模型(Mesh)总是在animation90度旋转之后回到其原始位置,这是贴纸改变的地方。 这样我们完全避免了万向节锁。


另一种方法是使用旋转matrix。

每个立方体单元格(拼图的3x3x3元素)有6个面,最多3个贴有自己的旋转matrix。 使用面法线乘以单元格的旋转matrix,您可以计算出哪个贴图点,因为在法线上只有一个轴在X,Y或Z上具有非零值+/- 1.0。

而且只会有9个指向同一方向的贴纸。

您可以使用单元格的位置来确定哪些要旋转。

由于立方体单元在animation结束时只能旋转到0,90,180,270,所以我们可以通过下面的方法来修正累积旋转误差:

 if (matrix[r][c] > 0.5) { matrix[r][c] = 1; } else if (matrix[r][c] < -0.5) { matrix[r][c] = -1; } else { matrix[r][c] = 0; } 

对于每个单元格(r = row,c = column),在animation完成后根除任何舍入错误。

通常比较浮点值和精确值是一个坏主意,但在这种情况下,我们正在固定matrix正好-1.0,0.0或1.0,没有任何翻译和任何(N)乘以这些数字总是正好结束了-N ,0或+ N,所以我们可以安全地比较它们。