3D Computer Grapihcs Using OpenGL - 12 Rotation Matrix

为了证明我们上节渲染出来的是一个立方体而不是一个平面,我们决定将它旋转一定角度,这样我们就需要一个旋转矩阵(也属于ModelTransformMatrix的一部分)

上一节我们的ModelTransformMatrix中做了一个移动(translation)的操作,所以我们将它重命名为translationMatrix。

先看修改后的paintGL()函数:

 1 void MyGlWindow::paintGL()
 2 {
 3     glClear(GL_DEPTH_BUFFER_BIT | GL_COLOR_BUFFER_BIT);
 4     glViewport(0, 0, width(), height());
 5 
 6     
 7     glm::mat4 translationMatrix = glm::translate(glm::mat4(1.0f), glm::vec3(0.0f, 0.0f,-3.0f));
 8     glm::mat4 rotationMatrix = glm::rotate(glm::mat4(1.0f), 54.0f, glm::vec3(1.0f, 0.0f, 0.0f));
 9     glm::mat4 projectionMatrix = glm::perspective(30.0f, ((float)width()) / height(), 0.1f, 10.0f);
10 
11     glm::mat4 fullTransformMatrix = projectionMatrix * translationMatrix * rotationMatrix;
12 
13     GLint fullTransformMatrixUniformLocation = glGetUniformLocation(programID, "fullTransformMatrix");
14     
15 
16     glUniformMatrix4fv(fullTransformMatrixUniformLocation, 1, GL_FALSE, &fullTransformMatrix[0][0]);
17     
18 
19     glDrawElements(GL_TRIANGLES, numIndices, GL_UNSIGNED_SHORT, 0);
20 
21 }

第8行是我们新定义的旋转矩阵,它的意义是绕x轴旋转54度。

第11行将projectionMatrix和translationMatrix, rotationMatrix结合起来,形成一个完整的MP矩阵。(矩阵是可以相乘结合的,但是要注意顺序,后操作的要在前面,例如projection操作是在ModelTransform之后的,所以在这里要放在最前。而先旋转还是先移动,都无所谓,因此后两个矩阵的顺序无关紧要)

这样我们就不需要两个uniform了,在shader里只需要接收一个fullTransformMatrix就行了,修改VertexShader如下:

 1 #version 430                           
 2                                        
 3 in layout(location=0) vec3 position;   
 4 in layout(location=1) vec3 vertexColor;                                       
 5                                       
 6 uniform mat4 fullTransformMatrix; 
 7 
 8 out vec3 passingColor;
 9                                        
10 void main()                            
11 {                                      
12   vec4 v =  vec4(position,1.0);
13   gl_Position = fullTransformMatrix * v;
14   passingColor= vertexColor;           
15 }

第13行,我们直接用fullTransformMatrix去乘以局部坐标v就能得到最后的projected 坐标。

编译运行得到如下图形:

posted @ 2018-01-26 16:29  Ken_An  阅读(270)  评论(0编辑  收藏  举报