如何以中心旋转立方体

How to rotate a cube by its center

我正在尝试使用键盘旋转一个 "cube" 满是小立方体的键盘,但效果不是很好。

我正在努力将旋转的枢轴点设置到大 "cube" / 世界的中心。正如你在这个 video 上看到的,大立方体前(初始)面的中心是我现在旋转的轴心点,当我稍微旋转世界时,这有点混乱。

为了更好地解释它,看起来我在使用键旋转立方体时正在移动立方体的初始面。所以从这个角度来看,枢轴点可能没问题,但我的代码有什么问题?我不明白为什么它是通过正面移动的,而不是整个立方体的中心?

在生成所有小立方体的情况下,我在 3 个 for 循环 (x, y, z) 和函数 returns 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;

在这 3 个 for 循环中也是这样的:

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

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

您正在通过右乘法累加旋转矩阵。这样,所有旋转都在所有先前变换产生的局部坐标系中执行。这就是为什么你的右旋转导致在上旋转后转弯(因为它是局部坐标系中的右旋转)。

但是您希望您的旋转位于全球坐标系中。因此,简单地反转乘法顺序:

total_rotation = rotation * total_rotation;