C++ OPENGL-三角形移动
我的opengl项目有问题。我必须创建沿x轴移动的三角形。它必须改变颜色并掉头。我创造了这个,但我不知道加速是怎么回事C++ OPENGL-三角形移动,c++,opengl,C++,Opengl,我的opengl项目有问题。我必须创建沿x轴移动的三角形。它必须改变颜色并掉头。我创造了这个,但我不知道加速是怎么回事 #include <stdio.h> #include <stdlib.h> #include<iostream> #include <math.h> #include<iomanip> #include <time.h> #include "glut.h" #include "math.h"
#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;
}
#包括
#包括
#包括
#包括
#包括
#包括
#包括“glut.h”
#包括“math.h”
使用名称空间std;
浮动x=0,y=0,角度=0,角度n=0,q=1,w=1,e=1,qn=0,wn=0,en=0;
双xn=0,c=0;
int-licznik=0;
int-zmiana=0,a=0;
bool-flaga=true;
静态无效timerCallback(int值)
{
如果(xn!=x)
{
licznik++;//odliczanie kolejnych klatek
x+=xn/100.0;
角度+=角度/100.0;
q+=qn/100.0;
w+=wn/100.0;
e+=en/100.0;
如果(q>1){q=0;}
如果(w>1){w=0;}
如果(e>1){e=0;}
再发现();
glutTimerFunc(50,timerCallback,value);//Ustawiene ponownego wywołania naszej funkcji“timerCallback”po 100毫秒
}
如果(licznik==100)
{
如果(a==0){x=-0.8;glutPostRedisplay();}
else如果(a==1){x=0;glutPostRedisplay();}
如果(a==2){x=0.8;GLUTPOSTRESDISPLAY();}
else如果(a==3){x=0;glutPostRedisplay();}
xn=0;
角n=0;
licznik=0;
zmiana=1;
}
}
空心套管(浮动x、浮动y、浮动角度)
{
gl3f(q,w,e);
glPushMatrix();
glTranslatef(x,y,0);
glRotatef(角度,0,0,1);
glBegin(GL_多边形);
glVertex2f(0,0.2);
glVertex2f(-0.2,-0.2);
glVertex2f(0.2,-0.2);
格伦德();
glPopMatrix();
}
void przesuwanie()
{
a++;
如果(a>3){a=0;};
如果((a==1)| |(a==2)){flaga=true;}
如果((a==0)| |(a==3)){flaga=false;}
如果(flaga==true)
{
xn+=0.8;角度+=360;
qn+=0.1;
wn+=0.7;
en+=0.3;
}
else if(flaga==false)
{
xn-=0.8;角度+=360;
qn+=0.8;
wn+=0.4;
en+=0.3;
}
zmiana=4;
//Wyserowanie zliczania klatek
时光倒流(0)//wywołanie funkcji która będzie sięokreswo powtarzać
}
void przesuwanie_w_lewo()//pierwsze przesuniecie o poł欠jednostki
{
xn=0;
xn-=.8;
角度+=360;
qn-=0.9;
wn-=0.7;
en-=.3;
zmiana=4;
timerCallback(0);
//瓦瓦尼·芬克基·克托拉·博季西·奥克雷索沃·鲍塔尔扎ć(wywołanie funkcji która będzie sięokreswo powtarzać)
}
作废显示(作废)
{
/*清除窗口*/
glClear(GLU颜色缓冲位);
trojkat(x,y,角);
glFlush();
如果((zmiana==0)| |(zmiana==1)| |(zmiana==2))
{
如果(zmiana==0)
{
przesuwanie_w_lewo();
}
else if(zmiana==1)
{
przesuwanie();
}
}
}
void init()
{
/*将“清除颜色”设置为黑色*/
glClearColor(0.0,0.0,0.0,0.0);
/*将填充颜色设置为白色*/
/*使用剪裁设置标准正交视图*/
/*长方体为以原点为中心的第2面立方体*/
/*这是默认视图,可以删除这些语句*/
glMatrixMode(GL_投影);
glLoadIdentity();
格洛托(-1.0,1.0,-1.0,1.0,-1.0,1.0);
glMatrixMode(GLU模型视图);
glLoadIdentity();
}
int main(int argc,char*argv[])
{
glutInit(&argc,argv);
glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);
glutInitWindowSize(400400);
glutInitWindowPosition(0,0);
玻璃窗(“trojkat”);
glutDisplayFunc(显示器);
init();
glutMainLoop();
返回0;
}
速度到底有什么问题?因为速度不规则。