如何按中心旋转立方体

Posted

技术标签:

【中文标题】如何按中心旋转立方体【英文标题】:How to rotate a cube by its center 【发布时间】:2017-11-05 16:30:44 【问题描述】:

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

我正在努力将旋转轴心点设置为大“立方体”/世界的中心。正如你在video 上看到的,大立方体的前(初始)面的中心是我现在旋转的轴心点,当我稍微旋转世界时,这有点令人困惑。

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

在生成所有小立方体的情况下,我在 3 个 for 循环 (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;

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

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

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

【问题讨论】:

视频中旋转的不是立方体中心,也就是你想要的吗? 我可能描述得不太好,抱歉。它在世界中间“旋转”,但由于某种原因,键盘控制“移动”正面,或者使用控件,看起来我正在通过按住正面来旋转立方体。 对不起,我不明白你想说什么。我已经看了几次视频,但我看不出有什么奇怪的地方。 注意,当我向上旋转立方体,然后在视频结束时向右旋转。立方体的前(初始)面朝上,看向天空,然后我向右旋转,但是坐在“桌子”上的整个立方体应该向右旋转。相反,正面被拖到立方体的右侧,因此不再仰望天空。 啊,我想我明白了。请在计算后显示您对rotation 的处理。 【参考方案1】:

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

但您希望您的旋转位于全局坐标系中。因此,只需恢复乘法顺序:

total_rotation = rotation * total_rotation;

【讨论】:

天哪,没想到会这么容易。谢谢

以上是关于如何按中心旋转立方体的主要内容,如果未能解决你的问题,请参考以下文章

立方体在旋转时未按预期呈现

CAD的三维立体图形如何旋转角度?

Canvas实现3D效果-可旋转的立方体

openGL按照载体自身坐标系旋转

使用OpenGL如何实现物体绕体外任意轴旋转?

围绕其中心点旋转自定义几何网格