|
|
小弟要实现一个粒子在运动过程中和长方体作一个碰撞检测,
若用包围盒的方法,具体方法如下:
在更新粒子各项属性值时,判断该粒子的当前位置是否在长方体盒中,若在,则连线当前粒子位置和初始位置,并求出该连线与面的相交点.最后求出反射方向.
但不知道该如何判断粒子是否在盒子中,请高手提点一下,如果有关于这方面的例子或原代码更好.最好能写一下相关的函数,小弟是个初学者,不胜感激.
以下是部分相关代码:
//数据更新
if(fps==0) fps=30;
Particles oldParticle( *this );//保存的初始粒子属性
speed+=speed_acc;
Pos.y +=speed;
alpha-=alpha_dec;
size-=0.05f*(30/fps);
Pos.x +=-Pos.x/30.0f;
Pos.z +=-Pos.z/30.0f;
if(alpha<=0.0f) {
dead=true;
return;
}
//这里是进行判断:
//if 粒子在盒子里面 then
// 连线: oldParticle.Pos --> this-> os
// 连线与盒子求交点
// 求出反射方向
//长方体模型绘制:
glPushMatrix();
glTranslatef(56, 14, 56);
glBindTexture(GL_TEXTURE_2D, texture[0]); // 选择纹理
glBegin(GL_QUADS);
// 前面
glTexCoord2f(0.0f, 0.0f); glVertex3f(-4.0f, -2.0f, 4.0f); // 纹理和四边形的左下
glTexCoord2f(1.0f, 0.0f); glVertex3f( 4.0f, -2.0f, 4.0f); // 纹理和四边形的右下
glTexCoord2f(1.0f, 1.0f); glVertex3f( 4.0f, 2.0f, 4.0f); // 纹理和四边形的右上
glTexCoord2f(0.0f, 1.0f); glVertex3f(-4.0f, 2.0f, 4.0f); // 纹理和四边形的左上
// 后面
glTexCoord2f(1.0f, 0.0f); glVertex3f(-4.0f, -2.0f, -4.0f); // 纹理和四边形的右下
glTexCoord2f(1.0f, 1.0f); glVertex3f(-4.0f, 2.0f, -4.0f); // 纹理和四边形的右上
glTexCoord2f(0.0f, 1.0f); glVertex3f( 4.0f, 2.0f, -4.0f); // 纹理和四边形的左上
glTexCoord2f(0.0f, 0.0f); glVertex3f( 4.0f, -2.0f, -4.0f); // 纹理和四边形的左下
// 顶面
glTexCoord2f(0.0f, 1.0f); glVertex3f(-4.0f, 2.0f, -4.0f); // 纹理和四边形的左上
glTexCoord2f(0.0f, 0.0f); glVertex3f(-4.0f, 2.0f, 4.0f); // 纹理和四边形的左下
glTexCoord2f(1.0f, 0.0f); glVertex3f( 4.0f, 2.0f, 4.0f); // 纹理和四边形的右下
glTexCoord2f(1.0f, 1.0f); glVertex3f( 4.0f, 2.0f, -4.0f); // 纹理和四边形的右上
// 底面
glTexCoord2f(1.0f, 1.0f); glVertex3f(-4.0f, -2.0f, -4.0f); // 纹理和四边形的右上
glTexCoord2f(0.0f, 1.0f); glVertex3f( 4.0f, -2.0f, -4.0f); // 纹理和四边形的左上
glTexCoord2f(0.0f, 0.0f); glVertex3f( 4.0f, -2.0f, 4.0f); // 纹理和四边形的左下
glTexCoord2f(1.0f, 0.0f); glVertex3f(-4.0f, -2.0f, 4.0f); // 纹理和四边形的右下
// 右面
glTexCoord2f(1.0f, 0.0f); glVertex3f( 4.0f, -2.0f, -4.0f); // 纹理和四边形的右下
glTexCoord2f(1.0f, 1.0f); glVertex3f( 4.0f, 2.0f, -4.0f); // 纹理和四边形的右上
glTexCoord2f(0.0f, 1.0f); glVertex3f( 4.0f, 2.0f, 4.0f); // 纹理和四边形的左上
glTexCoord2f(0.0f, 0.0f); glVertex3f( 4.0f, -2.0f, 4.0f); // 纹理和四边形的左下
// 左面
glTexCoord2f(0.0f, 0.0f); glVertex3f(-4.0f, -2.0f, -4.0f); // 纹理和四边形的左下
glTexCoord2f(1.0f, 0.0f); glVertex3f(-4.0f, -2.0f, 4.0f); // 纹理和四边形的右下
glTexCoord2f(1.0f, 1.0f); glVertex3f(-4.0f, 2.0f, 4.0f); // 纹理和四边形的右上
glTexCoord2f(0.0f, 1.0f); glVertex3f(-4.0f, 2.0f, -4.0f); // 纹理和四边形的左上
glEnd();
glPopMatrix(); |
|