在自己的轴上旋转单个模型的矩阵

时间:2014-05-10 21:37:41

标签: c++ rotation glsl opengl-3

我目前在屏幕上显示了5个模型以及我尝试做的事情。以下是我的顶点着色器,用于单独翻译模型,以便我可以让它们向不同的方向移动:

#version 330
layout (location = 0) Position;

uniform mat4 MVP;
uniform vec3 Translation;
uniform mat4 Rotate;

void main()
{
    gl_Position = MVP * * Rotate * vec4(Position + Translation, 1.0); // Correct?
}

在渲染循环中单独定位/移动我的模型:

//MODEL ONE
glUniform3f(loc, 0.0f, 4.0f, 0.0f); // loc is "Translate"
glUniformMatrix4fv(loc, 1, GL_FALSE, glm::value_ptr(rotationMatrix)); // loc is "Rotate"
_model1.render();

我还有一个返回旋转的glm :: mat4 rotateMatrix()。但是当我将它与渲染循环中的其他矩阵相乘时,整个场景(减去相机)会旋转到设定角度。

更新 我如何能够在自己的轴上独立于世界的模型应用我的旋转?现在的问题是模型旋转,但是从世界的0,0,0而不是它自己的位置。

1 个答案:

答案 0 :(得分:0)

您的顶点着色器中存在一些语法错误:

  • Position变量没有类型。从上下文看它应该是vec3
  • *之后的两个MVP个符号。

我认为那些在复制代码时只是一个意外,而你实际上有一个可以编译的顶点着色器。

要在Rotate向量的平移之前应用Translation矩阵描述的旋转,您应该只需更改顶点着色器中的顺序:

vec4 rotatedVec = Rotate * vec4(Position, 1.0);
gl_Position = MVP * vec4(rotatedVec.xyz + Translation, 1.0);

如果您将Rotate定义为3x3矩阵,那么整个过程看起来会更简单,这对于旋转来说就足够了。