2011-11-04 48 views
1

有人可以解释我以下几行是什么吗?一些opengl和glm的解释

glm::mat4 Projection = glm::perspective(45.0f, 1.0f, 0.1f, 100.0f); 
angle = (GLfloat) (i % 360); 
glm::mat4 View = glm::mat4(1.); 
View = glm::translate(View, glm::vec3(0.f, 0.f, -5.0f)); 
View = glm::rotate(View, angle * -1.0f, glm::vec3(1.f, 0.f, 0.f)); 
View = glm::rotate(View, angle * 0.5f, glm::vec3(0.f, 1.f, 0.f)); 
View = glm::rotate(View, angle * 0.5f, glm::vec3(0.f, 0.f, 1.f)); 
glm::mat4 Model = glm::mat4(1.0); 
glm::mat4 MVP = Projection * View * Model; 
glUniformMatrix4fv(glGetUniformLocation(shaderprogram, "mvpmatrix"), 1, GL_FALSE, glm::value_ptr(MVP)); 

他们将单位转换为像素,但我不确定是否他们这样做。另一个问题,更一般的问题是,我如何表示一个数字,即sin(90)= 1,到10个像素,还是40或任何数字?我如何指定(0,0)将在屏幕中间?以上所有都由glm库保管好了吗?

回答

7

第一行创建等价于调用gluPerspective(45.0f,1.0f,0.1f,100.0f)的透视投影。如果你不知道该怎么做gluPerspective,看看这个link

glm::mat4 Projection = glm::perspective(45.0f, 1.0f, 0.1f, 100.0f); 

下一行刚模旋转角度360,以确保我们的投射角度小于360度。

angle = (GLfloat) (i % 360); 

接下来的几行定义了我们的视图矩阵。这基本上是您的相机视图端口,即您在显示器上看到的内容。该平移和旋转功能的调用都转换功能调用我们的摄像机移动到位置

glm::mat4 View = glm::mat4(1.); 
View = glm::translate(View, glm::vec3(0.f, 0.f, -5.0f)); 
View = glm::rotate(View, angle * -1.0f, glm::vec3(1.f, 0.f, 0.f)); 
View = glm::rotate(View, angle * 0.5f, glm::vec3(0.f, 1.f, 0.f)); 
View = glm::rotate(View, angle * 0.5f, glm::vec3(0.f, 0.f, 1.f)); 

下一行定义我们模型的位置。在这种情况下,它将是(1.0f,1.0f,1.0f,1.0f)。如果你想知道为什么有4个参数,而不是3,阅读OpenGL的橙皮书或检查维基百科上homogeneous coordinates

glm::mat4 Model = glm::mat4(1.0); 

最后两行完成的计算模型视图投影矩阵建立我们的场景,并把它传递给OpenGL的。

glm::mat4 MVP = Projection * View * Model; 
glUniformMatrix4fv(glGetUniformLocation(shaderprogram, "mvpmatrix"), 1, GL_FALSE,  glm::value_ptr(MVP)); 

总的来说你的代码块确实是从翻译模型模拟的OpenGL绘图管线坐标转换为视图坐标。

关于你问的第二个问题。我不明白第一部分,将数字转换为像素意味着什么?您是否试图将1D矩阵中的点映射到2D矩阵?如果是这种情况,只要做标准映射,就像像素[index/rows] [index%rows],其中pixel是你的屏幕像素对象,index是你的数组索引,row是你的屏幕宽度。对于第二部分(如何将(0,0)设置为屏幕中间),我认为您需要做的只是为屏幕原点添加一个偏移量,因为OpenGL使用左手坐标系,屏幕原点即(0,0)点将位于屏幕的左下角。所以如果你想让你的系统在屏幕中间,只需添加一个(-width/2, - 高度/ 2)的偏移量来将你的点转换为OpenGL空间或者(宽度/ 2,高度/ 2)投影。但不建议使用自己建立的标准。

0

设置的立体照相机变换:

glm::mat4 Projection = glm::perspective(45.0f, 1.0f, 0.1f, 100.0f); 

移动相机回落Z轴的位:

View = glm::translate(View, glm::vec3(0.f, 0.f, -5.0f)); 

旋转摄像机周围向后X轴:

View = glm::rotate(View, angle * -1.0f, glm::vec3(1.f, 0.f, 0.f)); 

围绕Y轴和Z轴旋转相机的速度为X轴的一半:

View = glm::rotate(View, angle * 0.5f, glm::vec3(0.f, 1.f, 0.f)); 
View = glm::rotate(View, angle * 0.5f, glm::vec3(0.f, 0.f, 1.f));