前面学习了画基本的三角形/正方形和纹理的使用,但是都是二维的,没有立体效果,看起来不够真实。本节则开始讲述如何画三维图像,以立方体为例。
为了勾勒立方体的形状,需要设置立方体的坐标。前面几节里通常只设置了x,y坐标,而将z设为0,这种方法画平面图形可以,三维图像则行不通,需要设置z的数值。立方体有六个面,OpenGL用的是右手坐标系,离镜头越远,z的值越大,坐标如下:
115 float vertices[] = {
116 -0.5f, -0.5f, -0.5f, // front
117 0.5f, -0.5f, -0.5f,
118 0.5f, 0.5f, -0.5f,
119 0.5f, 0.5f, -0.5f,
120 -0.5f, 0.5f, -0.5f,
121 -0.5f, -0.5f, -0.5f,
122
123 -0.5f, -0.5f, 0.5f, // back
124 0.5f, -0.5f, 0.5f,
125 0.5f, 0.5f, 0.5f,
126 0.5f, 0.5f, 0.5f,
127 -0.5f, 0.5f, 0.5f,
128 -0.5f, -0.5f, 0.5f,
129
130 -0.5f, 0.5f, 0.5f, // left
131 -0.5f, 0.5f, -0.5f,
132 -0.5f, -0.5f, -0.5f,
133 -0.5f, -0.5f, -0.5f,
134 -0.5f, -0.5f, 0.5f,
135 -0.5f, 0.5f, 0.5f,
136
137 0.5f, 0.5f, 0.5f, // right
138 0.5f, 0.5f, -0.5f,
139 0.5f, -0.5f, -0.5f,
140 0.5f, -0.5f, -0.5f,
141 0.5f, -0.5f, 0.5f,
142 0.5f, 0.5f, 0.5f,
143
144 -0.5f, -0.5f, -0.5f, // bottom
145 0.5f, -0.5f, -0.5f,
146 0.5f, -0.5f, 0.5f,
147 0.5f, -0.5f, 0.5f,
148 -0.5f, -0.5f, 0.5f,
149 -0.5f, -0.5f, -0.5f,
150
151 -0.5f, 0.5f, -0.5f, // top
152 0.5f, 0.5f, -0.5f,
153 0.5f, 0.5f, 0.5f,
154 0.5f, 0.5f, 0.5f,
155 -0.5f, 0.5f, 0.5f,
156 -0.5f, 0.5f, -0.5f,
157 };
每个面我们用六个顶点来表示(为了详细说明,这里没有用到element buffer, 那样每个面只需要设置4个顶点),和前面几节一样,将数据放到array buffer里面就可以了。这样画出来的结果如下:
我们只能看到正面,后面和侧面都看不到,因为我们是正对着物体的,后面和侧面都被挡住了,需要改变视线的位置,得将图形旋转一下。这就涉及到了mvp矩阵的设置,我们可以用比较著名的glm库(opengl mathematics: https://github.com/g-truc/glm/blob/master/manual.md), 里面内置了很多数学运算的函数,很方便的来调用, ubuntu按以下命令安装:
sudo apt-get install libglm-dev
glm::mat4(1.0f)就是个单位矩阵,我们将立方体沿着(1, 1, 0)这个轴旋转一下就可以了:
333 glm::mat4 mvp = glm::mat4(1.0f);
334 glm::mat4 transform = glm::mat4(1.0f);
335 for(int i=0; i < 4; i++)
336 cout << "transform-single.x=" << mvp[i].x << ",y=" << mvp[i].y << ",z=" <<