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

Rotate matrix of single model on its own axis

本文关键字:模型 单个 旋转 自己的      更新时间:2023-10-16

我目前有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 rotatemmatrix()返回旋转。但是当我将它与渲染循环中的其他矩阵相乘时,整个场景(减去摄像机)旋转到设定的角度。

我如何能够将我的旋转应用到模型上,而不依赖于它们自身轴上的世界?现在的问题是模型旋转,但从0,0,0的世界,而不是它自己的位置。

你的顶点着色器有几个语法错误:

  • 没有Position变量的类型。从上下文中看,它应该是vec3
  • MVP后两个*标志

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

要在从Translation向量转换之前应用Rotate矩阵描述的旋转,您应该能够简单地改变顶点着色器中的顺序:

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

如果您将Rotate定义为3x3矩阵,则整个事情看起来会更简单,这足以进行旋转。