Новичок
Профиль
Группа: Участник
Сообщений: 10
Регистрация: 3.7.2009
Репутация: нет Всего: нет
|
тех. задание вращение 2х сфер вокруг третьей при столкновении изменение законов движения. Реакции на столкновение невидно. по моему из-за того что сферы за 1 итерацию "проскакивают" слишком большой отрезок. Подскажите как быть? .сpp Код | #include "glwidget.h" #include "glu.h" #include <GL\glext.h> #include <GL\gl.h> using namespace std; GLWidget::GLWidget(QWidget *parent) :QGLWidget(QGLFormat(QGL::DoubleBuffer|QGL::DepthBuffer|QGL::StencilBuffer), parent){}
const int isolines1=128; const int isolines2=128;
void GLWidget::initializeGL() {flag=true; flag1=false; flag2=false; flag3=false; setAutoBufferSwap(true); glShadeModel(GL_SMOOTH); glEnable(GL_COLOR_MATERIAL); glEnable(GL_LIGHTING); GLfloat ambientLight[]={ 0.2, 0.2, 0.2, 1.0 }; GLfloat diffuseLight[]={ 0.5, 0.5, 0.5, 1.0 }; GLfloat lightPos[]={ 100, 100, 100, 0 }; glLightfv(GL_LIGHT0, GL_AMBIENT, ambientLight); glLightfv(GL_LIGHT0, GL_DIFFUSE, diffuseLight); glLightfv(GL_LIGHT0, GL_POSITION, lightPos); glEnable(GL_LIGHT0); glColorMaterial(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE);}
void GLWidget::resizeGL(int width, int height) {glViewport(0,0,width, height); glMatrixMode(GL_PROJECTION); glLoadIdentity(); glScalef(0.63f, 1.0f, 1.0f); glMatrixMode(GL_MODELVIEW);}
void GLWidget::paintGL() {
glClearColor(0, 0, 0, 0); glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT ); r1 = 0.1f; r2 = 0.1f; v1=1000.0; v2=1000.0;
static int time=-1570;
if (flag=true) {x3=(cos(((double)time)/v1)); y3=(sin(((double)time)/v1)); z3=0.0f; x4=(cos(((double)time)/v2)); y4=0.0f; z4=(sin(((double)time)/v2)); s=(((x3-x4)*(x3-x4))+((y3-y4)*(y3-y4))+((z3-z4)*(z3-z4))); if (((s)=0.04)){flag1=true;flag=false; } goto q;}
if (flag1=true){ x3=(cos(((double)time)/v1)); z3=(sin(((double)time)/v1)); y3=(sin(((double)time)/v1)); x4=(cos(((double)time)/v2))/sqrt(2); z4=(sin(((double)time)/v2))/sqrt(2); y4=(cos(((double)time)/v2))/sqrt(2); s=(((x3-x4)*(x3-x4))+((y3-y4)*(y3-y4))+((z3-z4)*(z3-z4))); if (((s)=0.04)){flag2=true;flag1=false;} goto q;}
if (flag2=true){ x3=(cos(((double)time)/v1)); z3=(sin(((double)time)/v1)); y3=(sin(((double)time)/v1)); //x4=(cos(((double)time)/100.0)); z4=(sin(((double)time)/v2)); y4=(cos(((double)time)/v2)); x4=0.0f; z3=0.0f; s=(((x3-x4)*(x3-x4))+((y3-y4)*(y3-y4))+((z3-z4)*(z3-z4))); if (((s)=0.04)) {flag3=true;flag2=false;} goto q;}
if (flag3=true) {x3=(cos(((double)time)/100.0)); z3=(sin(((double)time)/100.0)); y3=(sin(((double)time)/100.0)); x4=-(cos(((double)time)/100.0)); z4=(sin(((double)time)/100.0)); y4=(cos(((double)time)/100.0)); s=(((x3-x4)*(x3-x4))+((y3-y4)*(y3-y4))+((z3-z4)*(z3-z4))); if (((s)=0.04)){//flag = true; flag3=false;} goto q;}
q:{ if((z4<0) ){GLUquadricObj *qobj; // проверка обхода 2 qobj = gluNewQuadric(); r = 0.25f; glColor3f(1.0, 1.0, 0.0); glMatrixMode(GL_MODELVIEW); glPushMatrix(); glTranslated( 0.0 ,0.0,0.0); glTranslatef(0.0f,0.0f,0.0f); gluQuadricDrawStyle(qobj,GLU_SMOOTH); gluQuadricOrientation(qobj, GLU_OUTSIDE); gluQuadricNormals(qobj,GL_SMOOTH); gluSphere(qobj,r, isolines1, isolines2); glPopMatrix();
GLUquadricObj *qobj1; qobj1 = gluNewQuadric(); r1 = 0.1f; glColor3f(1.0,0.0, 0.0); glMatrixMode(GL_MODELVIEW); glPushMatrix(); glTranslatef(0.0f,0.0f,0.0f); glTranslated(x3,y3,z3); gluQuadricDrawStyle(qobj1,GLU_SMOOTH); gluQuadricOrientation(qobj1, GLU_INSIDE); gluQuadricNormals(qobj1,GL_SMOOTH); gluSphere(qobj1,r1, isolines1, isolines2); glPopMatrix();
GLUquadricObj *qobj2; qobj2 = gluNewQuadric(); r2 = 0.1f; glColor3f(0.0,0.0, 1.0); glMatrixMode(GL_MODELVIEW); glPushMatrix(); glTranslatef(0.0f,0.0f,0.0f); glTranslated( x4,y4,z4); gluQuadricDrawStyle(qobj2,GLU_SMOOTH); gluQuadricOrientation(qobj2, GLU_OUTSIDE); gluQuadricNormals(qobj2,GL_SMOOTH); gluSphere(qobj2,r2, isolines1, isolines2); glPopMatrix(); glPopMatrix(); gluDeleteQuadric(qobj2); }
else{ // проверка обхода 2 иначе GLUquadricObj *qobj1; qobj1 = gluNewQuadric(); r1 = 0.1f; glColor3f(1.0,0.0, 0.0); glMatrixMode(GL_MODELVIEW); glPushMatrix(); glTranslatef(0.0f,0.0f,0.0f); glTranslated( x3,y3,z3); gluQuadricDrawStyle(qobj1,GLU_SMOOTH); gluQuadricOrientation(qobj1, GLU_INSIDE); gluQuadricNormals(qobj1,GL_SMOOTH); gluSphere(qobj1,r1, isolines1, isolines2); glPopMatrix();
GLUquadricObj *qobj2; qobj2 = gluNewQuadric(); r2 = 0.1f; glColor3f(0.0,0.0, 1.0); glMatrixMode(GL_MODELVIEW); glPushMatrix(); glTranslatef(0.0f,0.0f,0.0f); glTranslated( x4,y4,z4); gluQuadricDrawStyle(qobj2,GLU_SMOOTH); gluQuadricOrientation(qobj2, GLU_OUTSIDE); gluQuadricNormals(qobj2,GL_SMOOTH); gluSphere(qobj2,r2, isolines1, isolines2); glPopMatrix(); glPopMatrix(); gluDeleteQuadric(qobj2);
GLUquadricObj *qobj; qobj = gluNewQuadric(); r = 0.25f; glColor3f(1.0, 1.0, 0.0); glMatrixMode(GL_MODELVIEW); glPushMatrix(); glTranslated( 0.0 ,0.0,0.0); glTranslatef(0.0f,0.0f,0.0f); gluQuadricDrawStyle(qobj,GLU_SMOOTH); gluQuadricOrientation(qobj, GLU_OUTSIDE); gluQuadricNormals(qobj,GL_SMOOTH); gluSphere(qobj,r, isolines1, isolines2); glPopMatrix();}}
swapBuffers(); time++; updateGL();
}
GLWidget::~GLWidget() {}
|
.h Код | #ifndef GLWIDGET_H #define GLWIDGET_H #include <QtOpenGL> #include <GL\glu.h> #include <GL\gl.h> #include <GL\glext.h> #include <math.h> class GLWidget : public QGLWidget {Q_OBJECT public: GLWidget(QWidget *parent); ~GLWidget(); GLUquadricObj* qobj; GLUquadricObj* qobj1; GLUquadricObj* qobj2; GLWidget() { qobj=gluNewQuadric(); qobj1=gluNewQuadric(); qobj2=gluNewQuadric();}; protected: void initializeGL(); void resizeGL(int width, int height); void paintGL(); GLdouble r; GLdouble r1; GLdouble r2; GLdouble s; GLdouble x2; GLdouble y2; GLdouble x3; GLdouble z3; GLdouble y3; GLdouble x4; GLdouble z4; GLdouble y4; //GLint h; GLdouble v1; GLdouble v2; bool flag; bool flag1; bool flag2; bool flag3; }; #endif // GLWIDGET_H
|
|