如何按中心旋转立方体
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;
【讨论】:
天哪,没想到会这么容易。谢谢以上是关于如何按中心旋转立方体的主要内容,如果未能解决你的问题,请参考以下文章