1
我已經成功繪製了一條正方形,其中有一條直線穿過它,一條帶有直線的梯形以及一條直線穿過梯形的正方形。在這一點上,我只是試圖讓所有的圖標在屏幕上緩慢旋轉,但無法弄清楚我出錯的地方。OpenGL:使圖標旋轉的問題
我已經爲我的程序建模了一段我之前寫過的程序,它使得多邊形在屏幕上行走並跳起來做翻轉,但由於某種原因,我無法從任何圖標中獲得任何移動。我的TimerFunction
沒有像我期望的那樣行事嗎?
我知道這是乏味的閱讀,但我包括我的整個代碼,因爲我不知道在哪裏的問題可能是...
void init(void); //function that initializes the window clear color
void DrawsAllIcons(float x[], float y[], int ndraws, int pointsperdraw [], int drawtype[], float colorr[], float colorg[], float colorb[], float rotate, float scalex, float scaley, float transx, float transy); //function to draw the functions in the opened window
void SetupRC(void);
void RenderScene(void);
void settrans2 (float rotate, float scalex, float scaley, float transx, float transy);//function that sets the clear color used to set the state of the OpenGL system
void TimerFunction(int);
//square
float rotate = 00.0;
float xCoords [7] = {1.0, 1.0, -1.0, -1.0, 1.0, 0.0, 0.0};
float yCoords [7] = {1.0,-1.0,-1.0,1.0,1.0,2.0,-2.0};
int numberofDraws = 2;
int pointsPerDraw[2] = {5, 2};
int typeOfDraw[2] = {2,1};
float colorR[3] = {1.0,0.0,0.0};
float colorg[3] = {0.0,1.0,0.0};
float colorb[3] = {0.0,0.0,1.0};
float transx = 5.0;
float transy = 5.0;
float scalex = 2.0;
float scaley = 2.0;
//trapezoid
float rotate2 = 00.0;
float xCoords2 [6] = {1.0, 1.5, -1.5, -1.0, 0.0, 0.0};
float yCoords2 [6] = {1.0,-1.0,-1.0,1.0,2.0,-2.0};
int numberofDraws2 = 2;
int pointsPerDraw2[2] = {4, 2};
int typeOfDraw2[2] = {3,1};
float colorR2[3] = {0.0,0.0,0.0};
float colorg2[3] = {1.0,1.0,0.0};
float colorb2[3] = {0.0,0.0,1.0};
float transx2 = -5.0;
float transy2 = -5.0;
float scalex2 = 2.0;
float scaley2 = 2.0;
//Square on trapezoid
float rotate3 = 00.0;
float xCoords3 [6] = {1.0, 1.0, -1.0, -1.0, 0.0,0.0};
float yCoords3 [6] = {1.0,0.0,0.0,1.0,3.0,-3.0};
int numberofDraws3 = 2;
int pointsPerDraw3[2] = {4, 2};
int typeOfDraw3[2] = {3,1};
float colorR3[3] = {1.0,0.0,0.0};
float colorg3[3] = {0.0,1.0,0.0}; //go down dont overthink
float colorb3[3] = {0.0,0.0,0.0};
float transx3 = 0.0;
float transy3 = 0.0;
float scalex3 = 1.0;
float scaley3 = 1.0;
//trapezoid under square
float rotate4 = 00.0;
float xCoords4 [6] = {1.5, 2.0, -2.0, -1.5, 0.0, 0.0};
float yCoords4 [6] = {0.0,-1.0,-1.0,0.0,3.0,-3.0};
int numberofDraws4 = 2;
int pointsPerDraw4[2] = {4, 2};
int typeOfDraw4[2] = {3,1};
float colorR4[3] = {0.0,0.0,0.0};
float colorg4[3] = {1.0,1.0,0.0};
float colorb4[3] = {0.0,0.0,1.0};
float transx4 = 0.0;
float transy4 = 0.0;
float scalex4 = 1.0;
float scaley4 = 1.0;
int main(int argc, char* *argv)
{
char header[]="This Bad Boy'll Draw any Icon you can think of"; //set up window title
glutInit(&argc, argv); // initialize glopen utility toolkit
glutInitDisplayMode(GLUT_DOUBLE|GLUT_RGB); // Set up the display mode with a buffer and colors **
glutInitWindowSize(560,440); //window size and position
glutInitWindowPosition(140,20);
SetupRC();
glutCreateWindow(header); // Open and label the window
glutDisplayFunc(RenderScene); //points to the function that will be drawing the item // Set the state of the rendering machine
glutTimerFunc(30, TimerFunction, 1);
glutMainLoop(); // Call and activate the main
return 0;
}
void RenderScene(void)
{
glClear(GL_COLOR_BUFFER_BIT);//note clear color was set in SetupRC
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glViewport(0,0,540,440); //set viewpoint to dimensions
glOrtho(-20.0,20.0,-20.0,20.0,1.0,-1.0);
glClear(GL_COLOR_BUFFER_BIT);
DrawsAllIcons(xCoords, yCoords, numberofDraws, pointsPerDraw,typeOfDraw,colorR,colorg,colorb, rotate, transx,transy,scalex,scaley); //used GL_LINE_STRIP for the square to show that that case worked
DrawsAllIcons(xCoords2, yCoords2, numberofDraws2, pointsPerDraw2,typeOfDraw2,colorR2,colorg2,colorb2, rotate2, transx2,transy2,scalex2,scaley2); //used GL_POLYGON and GL_LINE for rest
DrawsAllIcons(xCoords3, yCoords3, numberofDraws3, pointsPerDraw3,typeOfDraw3,colorR3,colorg3,colorb3, rotate3, transx3,transy3,scalex3,scaley3);
DrawsAllIcons(xCoords4, yCoords4, numberofDraws4, pointsPerDraw4,typeOfDraw4,colorR4,colorg4,colorb4, rotate4, transx4,transy4,scalex4,scaley4);
glEnd();
glutSwapBuffers(); //
}
void DrawsAllIcons (float x[], float y[], int ndraws, int pointsperdraw [], int drawtype[], float colorr[], float colorg[], float colorb[], float rotateD, float transxD, float transyD, float scalexD, float scaleyD)
{
settrans2(rotateD,scalexD,scaleyD,transxD, transyD);
int k=0; //index for arrays
int drawTooIndex = 0;
ndraws=ndraws-1;
for (int j=0; j<=ndraws; j++) //runs through
{
int whatCase = drawtype[j]; //sees what type of draw
drawTooIndex +=pointsperdraw[j];
switch (whatCase)
{
case 1:
{
glColor3f(colorr[j],colorg[j],colorb[j]);
glBegin(GL_LINES);
glVertex2f(x[k], y[k]); //sets vertex at the first point at k in the point arrays
int i = k+1;
k++;
for (i; i <drawTooIndex; i++)
{
glVertex2f(x[i], y[i]);
k++;
}
glEnd();
glFlush();
}
break;
case 2:
{
glColor3f(colorr[j], colorg[j], colorb[j]);
glBegin(GL_LINE_STRIP);
glVertex2f(x[k], y[k]);
int m = k+1;
k++;
for (m; m <drawTooIndex; m++)
{
glVertex2f(x[m], y[m]);
k++;
}
glEnd();
glFlush();
}
break;
case 3:
{
glColor3f(colorr[j], colorg[j], colorb[j]);
glShadeModel(GL_FLAT);
glBegin(GL_POLYGON);
glVertex2f(x[k], y[k]);
int n = k+1; //gets index of where to start drawing in the x and y arrays
k++;
for (n; n <drawTooIndex; n++)
{
glVertex2f(x[n], y[n]);
k++;
}
glEnd();
glFlush();
}
break;
}
}
}
void SetupRC(void)
{ // function sets the clear color of an open window, and then clears the open window
glClearColor(0.0f, 0.0f, 0.0f, 1.0f); // Set clear color to pale green
return;
}//end of SetupRC
void settrans2(float rotateDD, float scalexDD, float scaleyDD, float transxDD, float transyDD)
{
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glTranslatef(transxDD,transyDD,0.0);
glRotatef(rotateDD, 0.0, 0.0, 1.0); // where to put this in the program?
glScalef(scalexDD, scaleyDD, 1.0);
return;
}
void TimerFunction(int value)
{
rotate+=5.0;
rotate2+=5.0;
rotate3+=5.0;
rotate4+=5.0;
}
哇,不敢相信我錯過了那個。謝啦! – Bob