现代Opengl:旋转一个长方体,在长方体的一端有枢轴

Posted

技术标签:

【中文标题】现代Opengl:旋转一个长方体,在长方体的一端有枢轴【英文标题】:Modern Opengl: Rotate a cuboid with pivot at one end of the cuboid 【发布时间】:2019-10-24 01:51:59 【问题描述】:

所以,我用这个画了一个黄色长方体

glm::mat4 yellow_bone_obj_mat = m_bone_animation->get_yellow_mat();
glUniformMatrix4fv(glGetUniformLocation(shader.program, "model"), 1, GL_FALSE,
                   glm::value_ptr(yellow_bone_obj_mat));
bone_obj->obj_color = m_bone_animation->colors[1];
draw_object(shader, *bone_obj);

使用比例因子 0.5f,4.0f,0.5f 和位置 2.0f,3.0f,2.0f

我想让我的黄色长方体向右旋转 90 度,而黄色长方体的结束位置粘住红色立方体

应该是这样的

我试过了

m_yellow_mat = glm::translate(m_yellow_mat, glm::vec3(0.0, -0.5, 0.0)); //0.5f is just random number to check if pivot changed
m_yellow_mat = glm::rotate(m_yellow_mat, glm::radians(angle), glm::vec3(0, 0, 1));
m_yellow_mat = glm::translate(m_yellow_mat, glm::vec3(0.0, 0.5, 0.0));

得到这个作为输出

接下来我尝试了

m_yellow_mat = glm::translate(m_yellow_mat, glm::vec3(0.0, -0.5, 0.0)); //0.5f is just random number to check if pivot changed
m_yellow_mat = glm::rotate(m_yellow_mat, glm::radians(angle), glm::vec3(1, 0, 0)); //changed axis
m_yellow_mat = glm::translate(m_yellow_mat, glm::vec3(0.0, 0.5, 0.0));

将此作为输出。无论我做什么,长方体都不会落在右侧。我不知道为什么

【问题讨论】:

【参考方案1】:

你实际上做的是旋转一个完美的立方体并缩放旋转的立方体。立方体被旋转了,但比例被应用了,所以它看起来总是指向同一个方向。

你必须缩放立方体,然后你必须旋转立方体:

m_yellow_mat = translate(pivot) * rotate * translate(-pivot) * scale

注意,rotatescaletranslate 等操作会创建一个新矩阵并将当前矩阵乘以新矩阵。例如:

vec3 scale = glm::vec3(0.5f, 4.0f, 0.5f);
vec3 pivot = glm::vec3(0.0f, 0.5f, 0.0f);

m_yellow_mat = glm::mat4(1.0f);

m_yellow_mat = glm::translate(m_yellow_mat, pivot);
m_yellow_mat = glm::rotate(m_yellow_mat, glm::radians(angle), glm::vec3(0, 0, 1));
m_yellow_mat = glm::translate(m_yellow_mat, -pivot);
m_yellow_mat = glm::scale(m_yellow_mat, scale);

【讨论】:

非常感谢!我有几个问题!我的初始规模应该是多少?以及如何找到枢轴的y 值?

以上是关于现代Opengl:旋转一个长方体,在长方体的一端有枢轴的主要内容,如果未能解决你的问题,请参考以下文章

立方体旋转 - OpenGL

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

奇怪的 OpenGL 立方体

Opengl ES 1.x NDK实例开发之七:旋转的纹理立方体

现代 OpenGL:如何获得立方体的矢量位置?

OpenGL围绕自身而不是原点(0,0,0)旋转对象(一组立方体)