|
目的是绘制一个直角坐标系,并绘制一个四棱锥体,让锥体响应键盘的函数,对坐标系进行旋转。我虽然绘制了,但是只是显示椎体,不显示坐标系。另外,怎么让键盘响应起来,我用的是鼠标响应。希望有时间的朋友给看看,下面是源程序:
#include <glut.h>
//bool bLoadIdentity= false;
static int rotAngle = 0;
void init(void)
{glClearColor (0.0, 0.0, 0.0, 0.0);
glShadeModel (GL_SMOOTH);
}
//---画坐标系
///*
void drawAxis()
{
glPointSize(5);
glEnable(GL_POINT_SMOOTH);
glBegin(GL_POINTS);
glVertex2i(0,0);//在原点处画一个点
glEnd();
glBegin(GL_LINES);
glVertex2i(0,0);
glVertex2i(1,0);
glVertex2i(0,0);
glVertex2i(0,1);
glVertex2i(0,0);
glVertex2i(-1,-1);
glEnd();
}
//*/
void display(void)
{ glClear (GL_COLOR_BUFFER_BIT);
glColor3f (1.0, 1.0, 1.0);
glMatrixMode(GL_MODELVIEW);
//if(bLoadIdentity)
glLoadIdentity();
//---画坐标系----------------
///*
glPushMatrix();
glLoadIdentity();
glColor3f (1.0, 0.0, 0.0); //红色
drawAxis();
//------------------------
glRotatef(90,0,0,1);
//glTranslatef(0.5,0.0,0.0);
glColor3f (.0, 1.0, .0); //绿色
drawAxis();
//----------------------------
glRotatef(135,0,0,1);
//glTranslatef(0.5,0.0,0.0);
glColor3f (.0, .0, 1.0); //蓝色
drawAxis();
glPopMatrix();
//*/
gluLookAt(0.0,0.0,5.0,0.0,0.0,0.0,0.0,1.0,0.0);
glScalef(1.0,2.0,1.0);
glTranslatef(0.0f,0.0f,0.5f);//移出屏幕0.5
glRotated ((GLdouble)rotAngle, 1.0, 0.0, 0.0); //--------绕x轴旋转
//glutWireCube(1.0);
glBegin(GL_TRIANGLES);//开始绘制锥体
glColor3f(1.0f,0.0f,0.0f); //red
glVertex3f(0.0f,1.0f,0.0f);//front triangle (top piont)
glColor3f(0.0f,1.0f,0.0f); //green
glVertex3f(-1.0f,0.0f,1.0f);// (left)
glColor3f(0.0f,0.0f,1.0f); //blue
glVertex3f(1.0f,0.0f,1.0f);// (right)
glColor3f(1.0f,0.0f,0.0f); //red
glVertex3f(0.0f,1.0f,0.0f);//right triangle (top point)
glColor3f(0.0f,0.0f,1.0f); //blue
glVertex3f(1.0f,0.0f,1.0f);// (left)
glColor3f(1.0f,1.0f,0.0f); //yellow
glVertex3f(1.0f,0.0f,-1.0f);// (right)
glColor3f(1.0f,0.0f,0.0f); //red
glVertex3f(0.0f,1.0f,0.0f);//back triangle (top point)
glColor3f(1.0f,1.0f,0.0f); //yellow
glVertex3f(1.0f,0.0f,-1.0f);// (left)
glColor3f(1.0f,0.0f,1.0f); //purple
glVertex3f(-1.0f,0.0f,-1.0f);// (right)
glColor3f(1.0f,0.0f,0.0f); //red
glVertex3f(0.0f,1.0f,0.0f);//left triangle (top point)
glColor3f(1.0f,0.0f,1.0f); //purple
glVertex3f(-1.0f,0.0f,-1.0f);// (left)
glColor3f(0.0f,1.0f,0.0f); //green
glVertex3f(-1.0f,0.0f,1.0f);// (right)
glEnd();
glBegin(GL_QUADS);
glColor3f(0.0f,1.0f,0.0f); //green
glVertex3f(-1.0f,0.0f,1.0f);//bottum?
glColor3f(0.0f,0.0f,1.0f); //blue
glVertex3f(1.0f,0.0f,1.0f);
glColor3f(1.0f,1.0f,0.0f); //yellow
glVertex3f(1.0f,0.0f,-1.0f);
glColor3f(1.0f,0.0f,1.0f); //purple
glVertex3f(-1.0f,0.0f,-1.0f);
glEnd();
glFlush();
}
void reshape(int w, int h)
{
glViewport(0,0,(GLsizei)w,(GLsizei)h);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glFrustum(-1.0,1.0,-1.0,1.0,1.5,20.0);
glMatrixMode(GL_MODELVIEW);
//gluOrtho2D(-1.0,1.0,-1.0,1.0);
}
//-------键盘响应------------------------------
/*
void keyboard(char key, int state, int x, int y)
{
switch(key)
{
case 'x':
//if(state == GLUT_DOWN)
//{
//glRotated ((GLdouble)spin, 1.0, 0.0, 0.0);
spin = (spin+30)%360;
glutPostRedisplay();
//}
break;
case 'y':
spin = (spin+30)%360;
glutPostRedisplay();
break;
case 'z':
spin = (spin+30)%360;
glutPostRedisplay();
break;
default:
break;
}
}
*/
//------------鼠标响应---------------------------------
void mouse(int button, int state, int x, int y)
{
switch(button)
{
case GLUT_LEFT_BUTTON:
if(state == GLUT_DOWN)
{
//glRotated ((GLdouble)rotAngle, 1.0, 0.0, 0.0);
rotAngle += 30.;
if (rotAngle >= 360.)
rotAngle = 0.;
glutPostRedisplay();
}
break;
default:
break;
}
}
int main(int argc, char** argv)
{
glutInit(&argc, argv);
glutInitDisplayMode (GLUT_SINGLE | GLUT_RGB);
glutInitWindowSize (250, 250);
glutInitWindowPosition (100, 100);
glutCreateWindow ("OpenGL Transformation");
init ();
glutDisplayFunc(display);
glutReshapeFunc(reshape);
//glutKeyboardFunc(keyboard); //-------注册键盘响应
glutMouseFunc(mouse); //---------注册鼠标响应
glutMainLoop();
return 0;
}
|
|