在特定点

时间:2016-11-04 18:32:50

标签: c++ opengl rotation glm-math

我正在模拟牛顿摇篮,我遇到了电线/弦旋转的问题,因为它们当前围绕它们的中心旋转而不是它们连接到框架的位置。除了“翻译到旋转点,旋转,翻译”之外,似乎在线信息很少,这似乎不起作用。

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 个答案:

答案 0 :(得分:1)

作为旁注,OpenGL中不存在任何矩阵内容的“原生”实现(在GLSL之外)。

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

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

像这样的教程提供了对所有这些内容的深入解释,对你来说可能非常有用:

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