跟我一起学OpenGL- cube(立方体)

本文介绍如何在OpenGL中创建三维立方体,通过设置坐标包括z轴来实现立体效果。使用glm库进行矩阵变换,调整视角以显示立方体的不同面。
摘要由CSDN通过智能技术生成

前面学习了画基本的三角形/正方形和纹理的使用,但是都是二维的,没有立体效果,看起来不够真实。本节则开始讲述如何画三维图像,以立方体为例。

为了勾勒立方体的形状,需要设置立方体的坐标。前面几节里通常只设置了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=" <<
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值