实现这个功能之前需要你学习一下子矩阵的运算,包括向量*矩阵,矩阵*矩阵等等知识:
推荐数学向量
通过改变矩阵动态的完成物体的运动,用到了第三方库glm:
关键转换:
boxShader.vs:
#version 330 core
layout(location = 0) in vec3 aPos;
layout(location = 1) in vec3 aColor;
layout(location = 2) in vec2 aTexCoord;
out vec3 ourColor;
out vec2 texCoord;
uniform mat4 transform;
void main() {
gl_Position = transform * vec4(aPos,1.0);
ourColor = aColor;
texCoord = aTexCoord;
}
boxShader.fs:
#version 330 core
out vec4 FragColor;
in vec3 ourColor;
in vec2 texCoord;
uniform sampler2D texture1;
uniform sampler2D texture2;
uniform float mixNumber;
void main() {
FragColor = mix(texture(texture1,vec2(texCoord.x,texCoord.y)),texture(texture2,vec2(texCoord.x,texCoord.y)),mixNumber);
}
transform就是那个我们通过应用程序穿进去的矩阵变量值,transform有可能是几个变换组合而成的效果矩阵,
while (!glfwWindowShouldClose(window))
{
// input
// -----
processInput(window);
glClearColor(0.2f, 0.3f, 0.3f, 1.0f);
glClear(GL_COLOR_BUFFER_BIT);
float timeVary = (float)glfwGetTime();
// 生成变换矩阵
glm::mat4 trans;
// 移动到(0.5,-0.5)处
trans = glm::translate(trans,glm::vec3(0.0f,0.0f,0.0f));
trans = glm::rotate(trans, timeVary, glm::vec3(0.0f, 1.0f, 0.0f));
trans = glm::rotate(trans, timeVary, glm::vec3(0.0f, 0.0f, 1.0f));
trans = glm::rotate(trans, timeVary, glm::vec3(1.0f, 0.0f, 0.0f));
//trans = glm::scale(trans, glm::vec3(0.5f, 0.5f, 0.5f));
glUniform1f(glGetUniformLocation(shaderItem.ID, "mixNumber"), mixNumber);
glUniformMatrix4fv(glGetUniformLocation(shaderItem.ID, "transform"),1,GL_FALSE,glm::value_ptr(trans));
//double curTime = glfwGetTime();
//shaderItem.setFloat("offsetY", 0.3);
//shaderItem.setFloat("degree",curTime);
//// draw
//drawSomgthing();
//drawMyElement(VAO,textureArr,sizeof(textureArr) / sizeof(*textureArr));
//shaderItem.use();
drawMyElement(VAO,textureArr, sizeof(textureArr) / sizeof(*textureArr));
// -------------------------------------------------------------------------------
glfwSwapBuffers(window);
glfwPollEvents();
}
这里的效果是:沿着x,y,z轴旋转所得到的效果