OPENGL-三角形移动

时间:2015-03-16 13:19:52

标签: c++ opengl

我的opengl项目有问题。我必须创建移动三角形alonge x轴。它也必须改变颜色并转身。我创造了这个,但我不知道加速会发生什么......

#include <stdio.h>      
#include <stdlib.h> 
#include<iostream>
#include <math.h>
#include<iomanip>
#include <time.h>
#include "glut.h"
#include "math.h"

using namespace std;
float x = 0, y = 0, angle = 0, anglen = 0,q=1,w=1,e=1,qn=0,wn=0,en=0;
double xn = 0,c=0;
int licznik = 0;
int zmiana = 0,a=0;
bool flaga = true;


static void timerCallback(int value)
{
if (xn!=x)
{

    licznik++; //odliczanie kolejnych klatek

    x += xn / 100.0;
    angle += anglen / 100.0;
    q += qn / 100.0;
    w += wn / 100.0;
    e += en / 100.0;
    if (q > 1){ q = 0; }
    if (w > 1){ w = 0; }
    if (e > 1){ e = 0; }

    glutPostRedisplay();
    glutTimerFunc(50, timerCallback, value); //ustawienie ponownego wywołania naszej funkcji "timerCallback" po 100 ms
}
if (licznik==100)
{
    if (a == 0){ x = -0.8; glutPostRedisplay(); }
    else if (a == 1){ x = 0; glutPostRedisplay(); }
    else if (a == 2){ x = 0.8; glutPostRedisplay(); }
    else if (a == 3){ x = 0; glutPostRedisplay(); }

    xn = 0;
    anglen = 0;
    licznik = 0;
    zmiana = 1; 
}
}


void trojkat(float x, float y, float angle)
{
glColor3f(q, w, e);
glPushMatrix();
glTranslatef(x, y, 0);
glRotatef(angle, 0, 0, 1);


glBegin(GL_POLYGON);
glVertex2f(0, 0.2);
glVertex2f(-0.2, -0.2);
glVertex2f(0.2, -0.2);

glEnd();
glPopMatrix();
}


void przesuwanie()
{

a++;
if (a >3){ a = 0; };
if ((a == 1) || (a == 2)){ flaga = true; }
else if ((a == 0) || (a == 3)){flaga = false;}


if (flaga == true)
{
    xn += .8; anglen += 360; 
    qn += .1;
    wn += .7;
    en += .3;
}
else if (flaga == false)
{
    xn -= .8; anglen += 360; 
    qn += .8;
    wn += .4;
    en += .3;
}
zmiana = 4;
//wyzerowanie zliczania klatek
timerCallback(0); //wywołanie funkcji która będzie się okresowo powtarzać
}

void przesuwanie_w_lewo()// pierwsze przesuniecie o połowe jednostki
{
xn = 0;
xn -= .8;
anglen += 360;
qn -= .9;
wn -= .7;
en -= .3;

zmiana = 4;
timerCallback(0);
//wywołanie funkcji która będzie się okresowo powtarzać

}

void display(void)
{
/* clear window */

glClear(GL_COLOR_BUFFER_BIT);

trojkat(x, y, angle);

glFlush();

if ((zmiana == 0) || (zmiana == 1) || (zmiana == 2))
{
    if (zmiana == 0)
    {
        przesuwanie_w_lewo();
    }
    else if (zmiana==1)
    {
        przesuwanie();
    }
   }
 }




void init()
{
/* set clear color to black */
glClearColor(0.0, 0.0, 0.0, 0.0);
/* set fill  color to white */


/* set up standard orthogonal view with clipping */
/* box as cube of side 2 centered at origin */
/* This is default view and these statement could be removed */
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho(-1.0, 1.0, -1.0, 1.0, -1.0, 1.0);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
}

int main(int argc, char* argv[])
{
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);
glutInitWindowSize(400, 400);
glutInitWindowPosition(0, 0);
glutCreateWindow("trojkat");
glutDisplayFunc(display);
init();
glutMainLoop();

return 0;
}

0 个答案:

没有答案