在OpenGL中围绕特定点旋转对象

Posted

技术标签:

【中文标题】在OpenGL中围绕特定点旋转对象【英文标题】:Rotating object in OpenGL around specific point 【发布时间】:2016-11-04 18:32:50 【问题描述】:

我正在为 Newtons Cradle 建模,我遇到了电线/绳子旋转的问题,因为它们当前围绕它们的中心旋转,而不是它们连接到框架的位置。除了似乎不起作用的“翻译到旋转点,旋转,翻译回来”之外,网上似乎很少有信息。

std::stack<glm::mat4>model; 
model.push(glm::mat4(1.0f));
model.top() = glm::translate(model.top(), glm::vec3(x, y, z));

model.top() = glm::rotate(model.top(), vx, glm::vec3(1, 0, 0)); //rotating in clockwise direction around x-axis
model.top() = glm::rotate(model.top(), vy, glm::vec3(0, 1, 0)); //rotating in clockwise direction around y-axis
model.top() = glm::rotate(model.top(), vz, glm::vec3(0, 0, 1)); //rotating in clockwise direction around z-axis
model.top() = glm::scale(model.top(), glm::vec3(scale/40, scale*5, scale/40));//scale equally in all axis
model.top() = glm::translate(model.top(), glm::vec3(-x, -y, -z));
glUniformMatrix4fv(modelID, 1, GL_FALSE, &model.top()[0][0]);

glm::mat3 normalmatrix = glm::transpose(glm::inverse(glm::mat3(View * model.top())));
glUniformMatrix3fv(normalmatrixID, 1, GL_FALSE, &normalmatrix[0][0])

这是平移和旋转的位或其当前迭代,堆栈此时实际上什么都不做。 如果我的问题不清楚,想象一下模拟时钟臂,它将在其末端围绕时钟中心旋转,而不是由臂本身的中心旋转。我知道在 OpenGl 中没有围绕特定点旋转对象的本机实现

【问题讨论】:

【参考方案1】:

附带说明,OpenGL(GLSL 之外)中不再有任何矩阵内容的“本机”实现。

您的问题是您只是将 top() 矩阵设置为一个值,而不是通过将它们相乘来累积转换。

您稍后可能还会注意到一个问题,即它没有移回同一个位置(在将矩阵相乘之后)。这是因为您在转换回原始位置之前将对象缩小了很多。转换的顺序很重要。

像这样对所有这些内容进行深入解释的教程可能对您非常有用:

http://www.opengl-tutorial.org/beginners-tutorials/tutorial-3-matrices/

【讨论】:

以上是关于在OpenGL中围绕特定点旋转对象的主要内容,如果未能解决你的问题,请参考以下文章

OpenGL +围绕点旋转弹簧和质量

如何在 OpenGL 中围绕 Z 轴中心旋转对象?

OpenGL 在进行自旋转时围绕对象旋转

OpenGL绕点旋转

围绕世界轴OpenGL旋转对象

opengl 围绕固定轴旋转对象