当前位置:文档之家› 虚拟现实技术基础与应用代码-8 综合实例

虚拟现实技术基础与应用代码-8 综合实例

motor.DrawMotor();//绘制消防车
glPopMatrix();
}
8.3.3
在三维场景的初始化中,主要涉及相关库文件的包含,窗口的大小,场景的大小,场景对象的定义,以及光照效果设置等,其代码如下:
//注:以下代码写在文件main.cpp中
#include <gl/glut.h>
#include <math.h>
glTexCoord2f(0.0f,1.0f); glVertex3f( -width, height, -length);
glTexCoord2f(0.0f,0.0f); glVertex3f( -width, height, length);glEnd();
glPopMatrix(); //绘制结束
#include "CBMPTexture.h"
class CGround
{
public:
CBMPTexturetextObj; //地面纹理
float length; //长度
float width; //宽度
float height; //高度
CGround(){}; //构造函数
CGround(char file[][255]); //构造函数
motor.Position[2]=Eye[2];
//地面
glPushMatrix();
glColor3f(1.0,1.0,1.0); //改变颜色
groutrix();
//火焰
glPushMatrix();
glColor3f(1.0,1.0,1.0); //改变颜色
glGetBooleanv(GL_LIGHTING,&lp);
glDisable(GL_LIGHTING); //关闭光照
//开始绘制
glEnable(GL_TEXTURE_2D);
//绘制地面
glPushMatrix();
glTranslatef(0,0,-10);
glBindTexture(GL_TEXTURE_2D, textObj.texture[0]);
{
motor.Init();
ground.Init();
build1.Load3DSModel("3DSModel\\卧式油罐.3DS");
//火焰设置
m_Fire.SetPosition(200.0,63.0,0.0);
m_Fire.SetMode(20,50,10,0.0,0);
m_Fire.Init(PI/2,0);
m_3DSBasket.Load3DSModel("3DSModel\\吊篮.3ds");
m_WaterGun.SetPosition(0,0,0); //水枪位置
m_WaterGun.SetMode(0.5,100, 10,-0.8,1); //粒子系统模式设置
m_WaterGun.Init(PI/2,PI/3);//水枪方向
glBegin(GL_QUADS);
//指定纹理坐标和顶点坐标
glTexCoord2f(1.0f,0.0f); glVertex3f( width, height, length);
glTexCoord2f(1.0f,1.0f); glVertex3f( width, height, -length);
rad=float(PI*angle/180.0);
Eye[0]=0.0;//眼睛前方65个单位的位置
Eye[1]=30.0;
Eye[2]=300.0;
Look[0]=0.0;//观察目标点的位置
Look[1]=30.0;
Look[2]=0.0;
motor.Position[0]=Eye[0]; //消防车的位置
}
消防车的绘制过程在成员函数DrawMotor中来完成,其实现形式如下:
//注:以下代码写在文件Motor.cpp中
void CMotor::DrawMotor()
{
glPushMatrix();
//车身
glColor3f(1.0,1.0,1.0);
glRotatef(90,0.0,1.0,0.0); //车的面向
glScalef(1.0, 1.0, 1.0);
m_3DSMotor.Draw();
//旋转支架
glScalef(1.0, 1.0, 1.0);
glTranslatef(0.0f,73.0f,-130.0f);
glRotatef(theta,0.0,1.0,0.0); //支架旋转
m_3DSSupport.Draw();
motor.Position[1]=0;
motor.Position[2]=Eye[2];
}
而成员函数Init主要对类Cscene中内嵌对象ground,motor,m_Fire和build1的纹理映射进行初始化,其实现形式取下:
//注:以下代码写在文件Scene.cpp中
void CScene::Init()
if(lp) //恢复光照状态
glEnable(GL_LIGHTING);
}
1.场景类的描述
以下我们来定义一个场景类,场景类是一个组合类,其数据成员包括:一个地面对象,一个消防车对象,一个油罐对象以及火焰对象,此外还包含相应的初始化函数和图形绘制函数,场景类的描述如下:
//注:以下代码写在文件Scene.h中
#include "Motor.h"
#include "Ground.h"
classCScene
{
public:
float PI; //圆周率
float rad; //角度(弧度)
float angle; //角度
float Look[3]; //观察目标点
float Eye[3]; //眼睛位置
CGround ground; //大地
8.3.2
建立了消防车的3ds模型后,我们就可以来定义一个消防车类了。消防车类中包含车身、云梯、吊篮成员对象,这些对象通过前节介绍的3ds载入类C3DSLoader来定义。此外我们在吊篮上安置一个消防水枪来模拟喷水效果,为此用前章定义好的粒子系统类CparticleSys来定义一个水枪效果对象。为实现云梯的交互运动,增加了云梯水平旋转的变量theta,和俯仰运动的变量phi。车身的运动由变量Position来控制。其消防车类的定义如下:
{
length=450.0f; //纵深
width=450.0f; //宽
height=5.0f; //高
}
地面的纹理过程通过调用成员函数Init来实现,其实现代码为:
//注:以下代码写在文件Ground.cpp中
void CGround::Init()
{
textObj.TextureInit();//地面纹理
m_Fire.DrawSys();
glPopMatrix();
//建筑物
glPushMatrix();
glColor3f(1.0,1.0,1.0);
glTranslatef(200.0,30.0,0.0);
glScalef(1.0,1.0,1.0);
build1.Draw(); //绘制建筑物
glPopMatrix();
//云梯
glScalef(1.0, 1.0, 1.0);
glTranslatef(0.0f,27.0f,0.0f);
glRotatef(phi,1.0,0.0,0.0); //云梯俯仰
m_3DSLadder.Draw();
//篮
glTranslatef(0.0f,-10.0f,280.0f);
glRotatef(-phi,1.0,0.0,0.0); //篮保持水平
GLfloat m_height;
//场景所需位图文件路径
char g_filepath[1][255]={"data/detail.BMP"};//地面纹理图片
//场景对象定义
float phi; //云梯俯仰角
//定义3ds载入对象
C3DSLoader m_3DSMotor; //车身
C3DSLoader m_3DSSupport; //云梯支架
C3DSLoader m_3DSLadder; //云梯
C3DSLoader m_3DSBasket; //篮子
CParticleSys m_WaterGun; //水枪效果
CMotor motor; //消防车
CParticleSys m_Fire; //火焰
C3DSLoaderbuild1; //建筑物(油罐)
CScene(){}; //构造函数
CScene(char file1[][255]); //构造函数
virtual ~CScene(); //析构函数
void Init(); //初始化
}
由此获得的纹理名称存放在对象textObj的数据成员texture[0]中。
定义好纹理后,就可以来绘制地面了。地面的绘制通过调用成员函数Render来实现,其实现代码为:
//注:以下代码写在文件Ground.cpp中
void CGround::Render()
{
//获得场景中光照状态
GLboolean lp;
}
成员函数DrawScene主要完成类Cscene中各个内嵌对象的绘制工作,实现形式为:
//注:以下代码写在文件Scene.cpp中
void CScene::DrawScene()
{
//消防车随控制键运动,位置更新
motor.Position[0]=Eye[0];
相关主题