虚拟驾驶环境搭建(二)

龙云尧个人博客,转载请注明出处。

CSDN地址:http://blog.csdn.net/michael753951/article/details/75073580

个人blog地址:http://yaoyl.cn/huan-jing-da-jian-er/


基本素材和环境的准备

显示列表

基本准备

显示列表部分的内容请先阅读<nehe学习笔记(九)>的”显示列表”部分.这里我就不再对代码进行一一解读了.

为了适应本次实验的需求,我们需要对boxcol数组进行适当修改,将原本的正方体模型数组转修改长方体,其中,顶点的绘制准则在<nehe学习笔记(八)>中有绘图进行描述.

BuildList函数填充

根据<nehe学习笔记(九)>中的内容,我们可以很清楚的知道显示列表的构建规则,本部分不多赘述.

为了模拟一个比较真实的驾驶环境,我们需要绘制一条公路,公路两边需要有草坪以免过于空旷,需要有楼房以让障碍物的出现不会很突兀.最后,因为需要突然出现一个障碍物,所以我们需要准备一个障碍物.

这些内容将在BuildList这个函数中完成,最终显示列表的表头存放在load中.渲染的时候,需要很很严谨的控制每个坐标点的位置,绘制完成之后最好能够显示出来以方便debug.

载入纹理

在LoadGLTextures函数中,我们实现了载入图片的操作.值得注意的是,在选择纹理的滤波方式的时候,我们需要选择临近滤波GL_NEAREST.否则会在渲染道路的时候,出现图片边界过于突兀,影响实验效果的情况.

举个例子,在加载道路的纹理时,代码如下:

1
2
3
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_NEAREST); // scale cheaply when image bigger than texture
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_NEAREST); // scale cheaply when image smalled than texture
gluBuild2DMipmaps(GL_TEXTURE_2D, 3, image1->sizeX, image1->sizeY, GL_RGB, GL_UNSIGNED_BYTE, image1->data);

到这里基本的素材准备就已经结束了,在DrawGLScene函数中进行合理设置,我们就能够预览整个实验环境了.

基础环境绘制

公路以及草地绘制

为了模拟比较正常的驾驶环境,我们需要搭建一条公路,公路两侧的草地,并将楼栋放置在公路两侧.

首先是绘制公路和草地.我们首选需要绘制整整条公路,使用一个for循环,向屏幕深处绘制12块道路贴图,这样能够尽可能让道路有无尽的感觉,同时,远方出现新的道路的时候,不会显得很突兀.你可以增加层数,比如将12增加至15甚至20,用来描绘更加真实的场景.

接下来,我们需要在公路两侧进行扩展,经过测试,我发现绘制一个12*12个单位的草坪纹理时,场景看上去便已经较为正常,在下一步运动的时候便已经不会很突兀,当然,你也可以根据你自己的需要提高场景的草坪纹理数.

公路和草地的绘制代码如下所示.run_len是在场景运动时需要用到的变量,这里你可以认为它的值为0.0.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
// 绘制公路
glBindTexture(GL_TEXTURE_2D, texture[0]);
for(int i = 0; i<12; ++i){
glLoadIdentity();
glTranslatef(-3.0f,-1.0f, (i+1)*(-4.0f)+run_len); // 移动绘点
glCallList(road);
}
// 绘制草地
glBindTexture(GL_TEXTURE_2D, texture[1]);
for(int i = 0; i<12; ++i){
for(int j = 0; j<12; ++j) {
if(j == 7) continue; // 此部分已经绘制了公路,使用continue而非让公路覆盖这一块草地是因为需要防止使用透视渲染时,画面异常,方便将来的扩展.
glLoadIdentity();
glTranslatef(-4.0f*(j-6)+1,-1.0f, (i+1)*(-4.0f)+run_len); // 移动绘点
glCallList(road); // 草地和道路使用同一套模型,只不过纹理不同而已.
}
}

楼栋绘制

因为楼栋的绘制并不像草坪和公路那样是固定出现的物体,漏洞的出现具有一定的随机性,就像我们一处陌生的道路路上行驶的时候,并不知道什么时候会出现一栋楼.

为了简单的检查楼栋是否能够正确的绘制,我们可以先使用将绘笔移动到固定位置的方法,然后调用glCallList即可.

如何让楼栋移动起来,我们将在后续完成.

到这里,基本的环境搭建就已经完成了,接下来我们将开始运动场景搭建.

Donate
  • Copyright: Copyright is owned by the author. For commercial reprints, please contact the author for authorization. For non-commercial reprints, please indicate the source.

请我喝杯咖啡吧~

支付宝
微信