如何以立方体中心为轴旋转立方体

3

我正在尝试使用键盘旋转一个充满小立方体的“立方体”,虽然可以工作,但不是很好。

我正在努力将旋转的中心点设置为大“立方体”/世界的正中心。如您在视频中所看到的,目前我的旋转中心点是大立方体/世界初始面的中心,当我稍微旋转世界时,这有点令人困惑。

更好地解释一下,当我使用键来旋转立方体时,它看起来像是移动了立方体的初始面。因此,从这个角度来看,旋转中心点可能没问题,但我的代码哪里出了问题?我不明白为什么它会沿着前面的面而不是整个立方体通过其正中心移动?

如果要生成所有小立方体,则在3个循环(x、y、z)中调用一个函数,并且该函数返回cubeMat,因此您可以在视频中看到所有立方体都已生成。

cubeMat = scale(cubeMat, {0.1f, 0.1f, 0.1f});
cubeMat = translate(cubeMat, {positioning...);

对于旋转本身,向左旋转的简短示例如下:
mat4 total_rotation; //global variable - never resets
mat4 rotation;       //local variable

if(keysPressed[GLFW_KEY_LEFT]){
            timer -= delta;
            rotation = rotate(mat4{}, -delta, {0, 1, 0});
}
... //rest of key controls
total_rotation *= rotation;

而这三个循环中还有这个:

program.setUniform("ModelMatrix", total_rotation * cubeMat);
cube.render();

我读到应该使用transformation将枢轴点设置为中心,但在这种情况下,如何将枢轴点设置在位于世界中心的小立方体内部?由于在循环中,我从x=0开始生成立方体,因此该立方体显然是x=2,y=2,z=2


视频中的旋转不是以立方体中心为中心吗,这不是你想要的吗? - Nico Schertler
我可能没有描述得很好,对此感到抱歉。它是围绕世界中心“旋转”的,但由于某种原因,键盘控制器会“移动”前面的面,或者使用控制器,看起来像是通过握住其前面的面旋转立方体。 - Ady96
抱歉,我不明白你想说什么。我已经看了几遍视频,但没有发现任何异常。 - Nico Schertler
请注意视频末尾当我将立方体向上旋转,然后向右旋转时。立方体的前(初始)面向上,朝向天空,然后我向右旋转,但整个立方体应该随之向右旋转,就像它放在“桌子”上一样。然而,实际上前面被拖到了立方体的右侧,所以不再朝向天空。 - Ady96
啊,我明白了。请展示一下在计算完rotation之后你做了什么。 - Nico Schertler
我添加了我如何使用旋转的内容-我的操作方式。 - Ady96
1个回答

5
您正在通过右乘法累积旋转矩阵。这样,所有的旋转都是在先前所有变换所产生的本地坐标系中执行的。这就是为什么您的右旋转会在上旋转后发生转向(因为它是在本地坐标系中进行的右旋转)。
但是您希望旋转在全局坐标系中执行。因此,只需颠倒乘法顺序即可:
total_rotation = rotation * total_rotation;

哦,我从没想过会这么容易。谢谢。 - Ady96

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接