实例介绍
【实例截图】
【核心代码】
glEnable(GL_TEXTURE_2D); /**< 启用纹理映射 */
char* file[] = {"data/marble.bmp","data/spark.bmp","data/boden.bmp","data/wand.bmp"};
/** 循环读入位图纹理 */
for(int i = 0; i < 4; i )
{
if(!m_texture[i].LoadBitmap(file[i])) /**< 载入位图文件 */
{
MessageBox(NULL,"装载位图文件失败!","错误",MB_OK); /**< 如果载入失败则弹出对话框 */
return false;
}
glGenTextures(1, &m_texture[i].ID); /**< 生成一个纹理对象名称 */
glBindTexture(GL_TEXTURE_2D, m_texture[i].ID); /**< 创建纹理对象 */
/** 控制滤波 */
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_S,GL_REPEAT);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_T,GL_REPEAT);
/** 创建纹理 */
gluBuild2DMipmaps(GL_TEXTURE_2D, GL_RGB, m_texture[i].imageWidth,
m_texture[i].imageHeight, GL_RGB, GL_UNSIGNED_BYTE,
m_texture[i].image);
}
return true;
}
/** 初始化OpenGL */
bool Test::Init()
{
/** 用户自定义的初始化过程 */
glClearColor(0,0,0,0);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
///设置光源参数
GLfloat spec[] = { 1.0, 1.0 ,1.0 ,1.0 };
GLfloat posl[] = { 0, 400, 0, 1 };
GLfloat amb[] = { 0.2f, 0.2f, 0.2f ,1.0f };
GLfloat amb2[] = { 0.3f, 0.3f, 0.3f ,1.0f };
float df=100.0;
glClearDepth(1.0f);
glEnable(GL_DEPTH_TEST);
glDepthFunc(GL_LEQUAL);
glEnable(GL_DEPTH_TEST);
glShadeModel(GL_SMOOTH);
glEnable(GL_CULL_FACE);
glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);
/** 设置材质属性 */
glMaterialfv(GL_FRONT,GL_SPECULAR,spec);
glMaterialfv(GL_FRONT,GL_SHININESS,&df);
/** 设置光源 */
glEnable(GL_LIGHTING);
glLightfv(GL_LIGHT0,GL_POSITION,posl);
glLightfv(GL_LIGHT0,GL_AMBIENT,amb2);
glEnable(GL_LIGHT0);
glLightModelfv(GL_LIGHT_MODEL_AMBIENT,amb);
glEnable(GL_COLOR_MATERIAL);
glColorMaterial(GL_FRONT,GL_AMBIENT_AND_DIFFUSE);
/** 开启混合 */
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE);
/** 开启纹理映射,并载入纹理 */
glEnable(GL_TEXTURE_2D);
LoadTexture();
/** 用两个互相垂直的平面模拟爆炸效果 */
glNewList( dlist = glGenLists(1), GL_COMPILE); /**< 创建显示列表 */
glBegin(GL_QUADS);
glRotatef(-45,0,1,0);
glNormal3f(0,0,1);
glTexCoord2f(0.0f, 0.0f); glVertex3f(-50,-40,0);
glTexCoord2f(0.0f, 1.0f); glVertex3f(50,-40,0);
glTexCoord2f(1.0f, 1.0f); glVertex3f(50,40,0);
glTexCoord2f(1.0f, 0.0f); glVertex3f(-50,40,0);
glNormal3f(0,0,-1);
glTexCoord2f(0.0f, 0.0f); glVertex3f(-50,40,0);
glTexCoord2f(0.0f, 1.0f); glVertex3f(50,40,0);
glTexCoord2f(1.0f, 1.0f); glVertex3f(50,-40,0);
glTexCoord2f(1.0f, 0.0f); glVertex3f(-50,-40,0);
glNormal3f(1,0,0);
glTexCoord2f(0.0f, 0.0f); glVertex3f(0,-40,50);
glTexCoord2f(0.0f, 1.0f); glVertex3f(0,-40,-50);
glTexCoord2f(1.0f, 1.0f); glVertex3f(0,40,-50);
glTexCoord2f(1.0f, 0.0f); glVertex3f(0,40,50);
glNormal3f(-1,0,0);
glTexCoord2f(0.0f, 0.0f); glVertex3f(0,40,50);
glTexCoord2f(0.0f, 1.0f); glVertex3f(0,40,-50);
glTexCoord2f(1.0f, 1.0f); glVertex3f(0,-40,-50);
glTexCoord2f(1.0f, 0.0f); glVertex3f(0,-40,50);
glEnd();
glEndList(); /**< 结束显示列表定义 */
/** 初始化变量 */
InitVars();
/** 初始化字体 */
if(!m_Font.InitFont())
MessageBox(NULL,"初始化字体失败!","错误",MB_OK);
ResizeDraw(true);
return true; /**< 成功返回 */
}
/** 用户自定义的卸载函数 */
void Test::Uninit()
{
for(int i=0; i < 4; i )
{
m_texture[i].FreeImage(); /**< 释放纹理图像占用的内存 */
glDeleteTextures(1, &m_texture[i].ID); /**< 删除纹理对象 */
}
/** 释放二次对象 */
if(cylinder_obj != NULL)
gluDeleteQuadric(cylinder_obj);
}
/** 程序更新函数 */
void Test::Update(DWORD milliseconds)
{
if (m_Keys.IsPressed(VK_ESCAPE) == true) /**< 按ESC退出 */
{
TerminateApplication();
}
}
/** 计算帧速 */
void Test::CaculateFrameRate()
{
static float framesPerSecond = 0.0f; /**< 保存显示帧数 */
static float lastTime = 0.0f; /**< 记录上次时间 */
float currentTime = GetTickCount() * 0.001f; /**< 获得当前时间 */
framesPerSecond; /**< 显示帧数递增1 */
/** 如果时间差大于1.0秒 */
if( currentTime - lastTime > 1.0f )
{
lastTime = currentTime; /**< 保存当前时间 */
m_Fps = framesPerSecond; /**< 当前帧数传给m_Fps */
framesPerSecond = 0; /**< 将帧数置零 */
}
}
/** 输出文字信息 */
void Test::PrintText()
{
char string[128]; /**< 用于保存输出字符串 */
glPushAttrib(GL_CURRENT_BIT); /**< 保存现有颜色属性信息 */
glColor3f(0.0f,1.0f,0.0f); /**< 设置文字颜色 */
/** 输出帧速 */
CaculateFrameRate(); /**< 计算帧速 */
sprintf(string,"FPS:%3.0f",m_Fps); /**< 字符串赋值 */
m_Font.PrintText(string, -5.0f,3.0f); /**< 输出字符串 */
glPopAttrib();
}
/** 检测是否与平面碰撞 */
int Test::TestIntersionPlane(const Plane& plane,const Vector3& position,const Vector3& direction, double& lamda, Vector3& pNormal)
{
double dotProduct = direction.dot(plane._Normal);
double l2;
///判断是否平行于平面
if ((dotProduct < ZERO) && (dotProduct > -ZERO))
return 0;
l2 = (plane._Normal.dot(plane._Position - position))/dotProduct;
///交点在射线相反方向,此时不发生碰撞
if (l2 < -ZERO)
return 0;
pNormal = plane._Normal;
lamda = l2;
return 1;
}
/** 检测是否与圆柱体碰撞 */
int Test::TestIntersionCylinder(const Cylinder& cylinder,const Vector3& position,const Vector3& direction, double& lamda, Vector3& pNormal,Vector3& newposition)
{
Vector3 RC;
double d;
double t,s;
Vector3 n,D,O;
double ln;
double in,out;
Vector3::subtract(position,cylinder._Position,RC);
Vector3::cross(direction,cylinder._Axis,n);
ln = n.mag();
if ( (ln<ZERO)&&(ln>-ZERO) ) return 0;
n.unit();
d = fabs( RC.dot(n) );
if (d <= cylinder._Radius)
{
Vector3::cross(RC,cylinder._Axis,O);
t = - O.dot(n)/ln;
Vector3::cross(n,cylinder._Axis,O);
O.unit();
s = fabs( sqrt(cylinder._Radius*cylinder._Radius - d*d) / direction.dot(O) );
in = t-s;
out = t s;
if (in<-ZERO){
if (out<-ZERO) return 0;
else lamda = out;
}
else
if (out<-ZERO) {
lamda = in;
}
else
if (in<out) lamda = in;
else lamda = out;
newposition = position direction*lamda;
Vector3 HB = newposition-cylinder._Position;
pNormal = HB - cylinder._Axis*(HB.dot(cylinder._Axis));
pNormal.unit();
return 1;
}
return 0;
}
int Test::FindBallCol(Vector3& point, double& TimePoint, double Time2, int& BallNr1, int& BallNr2)
{
Vector3 RelativeV;
TRay rays;
double MyTime = 0.0, Add = Time2/150.0, Timedummy = 10000, Timedummy2 = -1;
Vector3 posi;
///判断球和球是否相交
for (int i = 0;i<NrOfBalls-1;i )
{
for (int j = i 1;j<NrOfBalls;j )
{
RelativeV = ArrayVel[i]-ArrayVel[j];
rays = TRay(OldPos[i],Vector3::unit(RelativeV));
MyTime = 0.0;
if ( (rays.dist(OldPos[j])) > 40) continue;
while (MyTime<Time2)
{
MyTime = Add;
posi = OldPos[i] RelativeV*MyTime;
if (posi.dist(OldPos[j]) <= 40) {
point = posi;
if (Timedummy>(MyTime-Add)) Timedummy = MyTime-Add;
BallNr1 = i;
BallNr2 = j;
break;
}
}
}
}
if (Timedummy != 10000) { TimePoint = Timedummy;
return 1;
}
return 0;
}
/** 主要的处理过程 */
void Test::process()
{
double rt,rt2,rt4,lamda = 10000;
Vector3 norm,uveloc;
Vector3 normal,point,time;
double RestTime,BallTime;
Vector3 Pos2;
int BallNr = 0,dummy = 0,BallColNr1,BallColNr2;
Vector3 Nc;
///如果没有锁定到球上,旋转摄像机
// if (!hook_toball1)
// {
camera_rotation = 0.1f;
if (camera_rotation>360)
camera_rotation = 0;
// }
RestTime = Time;
lamda = 1000;
///计算重力加速度
for (int j = 0;j<NrOfBalls;j )
小贴士
感谢您为本站写下的评论,您的评论对其它用户来说具有重要的参考价值,所以请认真填写。
- 类似“顶”、“沙发”之类没有营养的文字,对勤劳贡献的楼主来说是令人沮丧的反馈信息。
- 相信您也不想看到一排文字/表情墙,所以请不要反馈意义不大的重复字符,也请尽量不要纯表情的回复。
- 提问之前请再仔细看一遍楼主的说明,或许是您遗漏了。
- 请勿到处挖坑绊人、招贴广告。既占空间让人厌烦,又没人会搭理,于人于己都无利。
关于好例子网
本站旨在为广大IT学习爱好者提供一个非营利性互相学习交流分享平台。本站所有资源都可以被免费获取学习研究。本站资源来自网友分享,对搜索内容的合法性不具有预见性、识别性、控制性,仅供学习研究,请务必在下载后24小时内给予删除,不得用于其他任何用途,否则后果自负。基于互联网的特殊性,平台无法对用户传输的作品、信息、内容的权属或合法性、安全性、合规性、真实性、科学性、完整权、有效性等进行实质审查;无论平台是否已进行审查,用户均应自行承担因其传输的作品、信息、内容而可能或已经产生的侵权或权属纠纷等法律责任。本站所有资源不代表本站的观点或立场,基于网友分享,根据中国法律《信息网络传播权保护条例》第二十二与二十三条之规定,若资源存在侵权或相关问题请联系本站客服人员,点此联系我们。关于更多版权及免责申明参见 版权及免责申明
网友评论
我要评论