对象的大小随着在OpenGL中围绕轴旋转而改变

时间:2014-07-01 14:26:45

标签: opengl graphics rotation transformation

我有一个三角形:

static const GLfloat g_vertex_buffer_data[] = { 
-1.0f, -1.0f, 0.0f, 
1.0f, -1.0f, 0.0f, 
0.0f, 1.0f, 0.0f
};

我在z轴上翻译了三角形。然后我尝试围绕x和y轴旋转:

mat4 rotationMatrix = glm::rotate(mat4(1.0f), rotation, vec3(1.0f, 0.0f, 0.0f));
mat4 translationMatrix = glm::translate(mat4(1.0f), vec3(position.x, position.y, -2.3f));

mat4 projectionMatrix = glm::perspective(90.0f, WindowWidth/WindowHeight, 1.0f, 1000.0f);

这是我的顶点着色器:

#version 330 core


layout(location = 0) in vec3 vertexPosition_modelspace;
uniform mat4 rotationMatrix;
uniform mat4 translationMatrix;
uniform mat4 projectionMatrix;

void main()
{
    gl_Position = projectionMatrix*rotationMatrix*translationMatrix* vec4(vertexPosition_modelspace,1.0f);

}

因为我无法添加图片,所以我必须添加图片'链接:

没有转变: https://www.dropbox.com/s/1eompnmjauvll9x/3.png

围绕x轴旋转: https://www.dropbox.com/s/9bpqb6nfudruuhx/ilk.png

围绕y轴旋转: www.dropbox.com/s/xxk9ofxfp4zk8ta/2.png

这对我来说似乎是正常的。为什么会这样?

1 个答案:

答案 0 :(得分:1)

这对我来说很正常。

由于您未使用视图矩阵,因此变换的结果(以及您在投影后在屏幕上看到的顶点坐标)将显示一个严重扭曲的三角形(变大)在Y方向上),当它向你旋转时,反过来,当它旋转离你时变小。

如果您想确保转换正确,请添加视图矩阵:

glm::mat4 viewMatrix = glm::lookAt(glm::vec3(5.0), glm::vec3(0.0), glm::vec3(0.0, 1.0, 0.0));

您可以将它作为制服发送到着色器,并使其看起来像这样:

gl_Position = projectionMatrix*viewMatrix*rotationMatrix*translationMatrix* vec4(vertexPosition_modelspace,1.0f);

如果您仍然可以看到失真效果,那么问题确实存在,但是从您的代码来看,我的猜测是它已经全部运转良好:)