我目前在屏幕上显示了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而不是它自己的位置。
答案 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矩阵,那么整个过程看起来会更简单,这对于旋转来说就足够了。