openopen
open吧
全部回复
仅看楼主
level 1
[一楼喂熊]
2010年11月27日 04点11分 1
level 1
几何体的简单变换
#include <stdlib.h>
#include <gl/glut.h>
void init(void)
{
glClearColor (0.0, 0.0, 0.0, 0.0);
glShadeModel (GL_FLAT);
}
void draw_triangle(void)
{
glBegin (GL_LINE_LOOP);
glVertex2f(0.0, 25.0);
glVertex2f(25.0, -25.0);
glVertex2f(-25.0, -25.0);
glEnd();
}
// 绘制长方体 width,height,depth分别为长方体的长,高和深度
void DrawCube(GLfloat width, GLfloat height ,GLfloat depth)
{
GLfloat x = width/2, y = height/2, z = depth/2;
glBegin(GL_QUADS);                     // 绘制长方体的各面
// 前面(front)
glColor3f(0.5f, 1.0f, 0.5f);            // 设置当前颜色(各对面颜色相同)
glVertex3f(-x, -y, z);                    // 前面四边形的左下顶点(正视)
glVertex3f( x, -y, z);                    // 前面四边形的右下顶点
glVertex3f( x,   y, z);                    // 前面四边形的右上顶点
glVertex3f(-x,   y, z);                    // 前面四边形的左上顶点
// 背面(back)
glVertex3f( x, -y, -z);                    // 背面四边形的左下顶点(正视)
glVertex3f(-x, -y, -z);                    // 背面四边形的右下顶点
glVertex3f(-x,   y, -z);                    // 背面四边形的右上顶点
glVertex3f( x,   y, -z);                    // 背面四边形的左上顶点
// 右侧面(right)
glColor3f(0.2f, 0.4f, 0.1f);
glVertex3f( x, -y,   z);                    // 右侧面四边形的左下顶点(正视)
glVertex3f( x, -y, -z);                    // 右侧面四边形的右下顶点
glVertex3f( x,   y, -z);                    // 右侧面四边形的右上顶点
glVertex3f( x,   y,   z);                    // 右侧面四边形的左上顶点
// 左侧面(left)
glVertex3f(-x, -y, -z);                    // 左侧面四边形的左下顶点(正视)

2010年11月27日 08点11分 2
level 1
glVertex3f(-x, -y,   z);                    // 左侧面四边形的右下顶点
glVertex3f(-x,   y,   z);                    // 左侧面四边形的右上顶点
glVertex3f(-x,   y, -z);                    // 左侧面四边形的左上顶点
// 顶面(top)
glColor3f(0.2f, 0.8f, 0.0f);
glVertex3f(-x,   y,   z);                    // 顶面四边形的左下顶点(正视)
glVertex3f( x,   y,   z);                    // 顶面四边形的右下顶点
glVertex3f( x,   y, -z);                    // 顶面四边形的右上顶点
glVertex3f(-x,   y, -z);                    // 顶面四边形的左上顶点
// 底面(bottom)
glVertex3f(-x, -y, -z);                    // 底面四边形的左下顶点(正视)
glVertex3f( x, -y, -z);                    // 底面四边形的右下顶点
glVertex3f( x, -y,   z);                    // 底面四边形的右上顶点
glVertex3f(-x, -y,   z);                    // 底面四边形的左上顶点
glEnd();
}
void display(void)
{    // display callback, clear frame buffer and z buffer
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);         // 清除场景和深度缓存
glLoadIdentity();                    // 重置当前矩阵
//在此处添加代码进行绘制:
glColor3f (1.0, 0.0, 0.0);
draw_triangle ();
glEnable (GL_LINE_STIPPLE);
glLineStipple (1, 0xF0F0);
glLoadIdentity ();
glTranslatef (-20.0, 0.0, 0.0);
draw_triangle ();
glLineStipple (1, 0xF00F);
glLoadIdentity ();
glScalef (1.5, 0.5, 1.0);
draw_triangle ();
glLineStipple (1, 0x8888);
glLoadIdentity ();
glRotatef (90.0, 0.0, 0.0, 1.0);
draw_triangle ();
glDisable (GL_LINE_STIPPLE);
glTranslatef(-2.0f, 0.0f,-8.0f);            // 左移2.0f,并移入屏幕8.0f
// 绘制金字塔
glClearDepth(1000.0f);

2010年11月27日 08点11分 3
level 1
十字架的动画
#include <stdlib.h>
#include <GL/glut.h>
void DrawCube(GLfloat width, GLfloat height ,GLfloat depth)
{
     GLfloat x = width/2, y = height/2, z = depth/2;
     glBegin(GL_QUADS);                              // 绘制长方体的各面
         // 前面(front)
         glColor3f(0.5f, 1.0f, 0.5f);       // 设置当前颜色(各对面颜色相同)
         glVertex3f(-x, -y, z);                      // 前面四边形的左下顶点(正视)
         glVertex3f( x, -y, z);                      // 前面四边形的右下顶点
         glVertex3f( x,   y, z);                      // 前面四边形的右上顶点
         glVertex3f(-x,   y, z);                      // 前面四边形的左上顶点
         // 背面(back)
         glVertex3f( x, -y, -z);                      // 背面四边形的左下顶点(正视)
         glVertex3f(-x, -y, -z);                      // 背面四边形的右下顶点
         glVertex3f(-x,   y, -z);                      // 背面四边形的右上顶点
         glVertex3f( x,   y, -z);                      // 背面四边形的左上顶点
        
         // 右侧面(right)
         glColor3f(0.2f, 0.4f, 0.1f);
         glVertex3f( x, -y,   z);                  // 右侧面四边形的左下顶点(正视)
         glVertex3f( x, -y, -z);                      // 右侧面四边形的右下顶点

2010年11月27日 09点11分 5
level 1
         glVertex3f( x,   y, -z);                      // 右侧面四边形的右上顶点
         glVertex3f( x,   y,   z);                      // 右侧面四边形的左上顶点
         // 左侧面(left)
         glVertex3f(-x, -y, -z);                  // 左侧面四边形的左下顶点(正视)
         glVertex3f(-x, -y,   z);                      // 左侧面四边形的右下顶点
         glVertex3f(-x,   y,   z);                      // 左侧面四边形的右上顶点
         glVertex3f(-x,   y, -z);                      // 左侧面四边形的左上顶点
         // 顶面(top)
         glColor3f(0.2f, 0.8f, 0.0f);
         glVertex3f(-x,   y,   z);                      // 顶面四边形的左下顶点(正视)
         glVertex3f( x,   y,   z);                      // 顶面四边形的右下顶点
         glVertex3f( x,   y, -z);                      // 顶面四边形的右上顶点
         glVertex3f(-x,   y, -z);                      // 顶面四边形的左上顶点
         // 底面(bottom)
         glVertex3f(-x, -y, -z);                      // 底面四边形的左下顶点(正视)
         glVertex3f( x, -y, -z);                      // 底面四边形的右下顶点

2010年11月27日 09点11分 6
level 1
         glVertex3f( x, -y,   z);                      // 底面四边形的右上顶点
         glVertex3f(-x, -y,   z);                      // 底面四边形的左上顶点
     glEnd();
}
void drawcross(void)
{
      // display callback, clear frame buffer and z buffer
    //glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);         // 清除场景和深度缓存
    //glLoadIdentity();                    // 重置当前矩阵
   
        // 绘制十字架        
     //glLoadIdentity();
//    glTranslatef(3.0f, 0.0f, 0.0f);                  // 往右移4.0f
     glRotatef(15.0f, 0.0f, 1.0f, 0.0f);              // 绕Y轴逆时针旋转10度
     DrawCube(2.0f, 0.6f, 0.6f);                      // 绘制一个长方体
     DrawCube(0.6f, 2.0f, 0.6f);                      // 绘制另一个长方体
     glLoadIdentity();
     // 绘制结束
}
static GLfloat theta[] = {0.0,0.0,0.0};
static GLint axis = 2;
static GLfloat view_x=0.0;
static GLfloat view_y=0.0;
static GLfloat view_z=0.0;
void display(void)
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
/* Update viewer position in modelview matrix */
     glLoadIdentity();
     gluLookAt(0.0,0.0,4.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0);
/* rotate cube */
     glDepthFunc(GL_LEQUAL);
     glTranslatef(view_x, view_y, view_z);
     glRotatef(theta[0], 1.0, 0.0, 0.0);
     glRotatef(theta[1], 0.0, 1.0, 0.0);
     glRotatef(theta[2], 0.0, 0.0, 1.0);
drawcross();
glFlush();
     glutSwapBuffers();
}
void mouse(int btn, int state, int x, int y)
{
     if(btn==GLUT_LEFT_BUTTON && state == GLUT_DOWN) axis = 0;
     if(btn==GLUT_MIDDLE_BUTTON && state == GLUT_DOWN) axis = 1;

2010年11月27日 09点11分 7
level 1
     if(btn==GLUT_RIGHT_BUTTON && state == GLUT_DOWN) axis = 2;
     theta[axis] += 2.0;
     if( theta[axis] > 360.0 ) theta[axis] -= 360.0;
     display();
}
void keys(unsigned char key, int x, int y)
{
    if(key == 'w'||key=='W')     { view_y=view_y+0.1;}
    if(key == 's'||key=='S')    { view_y=view_y-0.1;}
    if(key == 'a'||key=='A')    { view_x=view_x-0.1;}  
    if(key == 'd'||key == 'D')     { view_x=view_x+0.1;}
    if(key == '1')    { view_z=view_z+0.1;}
    if(key == '2')     { view_z=view_z-0.1;}
    display();
}
void myReshape(int w, int h)
{
glViewport(0, 0, w, h);
/* Use a perspective view */
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
     if(w<=h) glFrustum(-2.0, 2.0, -2.0 * (GLfloat) h/ (GLfloat) w,
        2.0* (GLfloat) h / (GLfloat) w, 2.0, 20.0);
     else glFrustum(-6.0, 6.0, -6.0 * (GLfloat) w/ (GLfloat) h,
        6.0* (GLfloat) w / (GLfloat) h, 2.0, 20.0);
/* Or we can use gluPerspective */
/* gluPerspective(45.0, w/h, -10.0, 10.0); */
glMatrixMode(GL_MODELVIEW);
}
void
main(int argc, char **argv)
{
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH);
glutInitWindowSize(500, 500);
glutInitWindowPosition(200,150);
glutCreateWindow("colorcube");
glutReshapeFunc(myReshape);
glutDisplayFunc(display);
     glutMouseFunc(mouse);
     glutKeyboardFunc(keys);
     glEnable(GL_DEPTH_TEST);
glutMainLoop();
}
2010年11月27日 09点11分 8
level 1
    glPopMatrix();
    //   绘制第一行第三列的球体,有漫反射和镜面反射,高光泽度,无环境光
    glPushMatrix();
    glTranslatef (1.25, 3.0, 0.0);
    glMaterialfv(GL_FRONT, GL_AMBIENT, no_mat);
    glMaterialfv(GL_FRONT, GL_DIFFUSE, mat_diffuse);
    glMaterialfv(GL_FRONT, GL_SPECULAR, mat_specular);
    glMaterialfv(GL_FRONT, GL_SHININESS, high_shininess);
    glMaterialfv(GL_FRONT, GL_EMISSION, no_mat);
    glutSolidSphere(1.0, 16, 16);
    glPopMatrix();
    //   绘制第一行第四列的球体,有漫反射和发射光,无环境光或镜面反射光
    glPushMatrix();
    glTranslatef (3.75, 3.0, 0.0);
    glMaterialfv(GL_FRONT, GL_AMBIENT, no_mat);
    glMaterialfv(GL_FRONT, GL_DIFFUSE, mat_diffuse);
    glMaterialfv(GL_FRONT, GL_SPECULAR, no_mat);
    glMaterialfv(GL_FRONT, GL_SHININESS, no_shininess);
    glMaterialfv(GL_FRONT, GL_EMISSION, mat_emission);
    glutSolidSphere(1.0, 16, 16);
    glPopMatrix();
    //   绘制第二行第一列的球体,有环境光和漫反射光,无镜面反射光
    glPushMatrix();
    glTranslatef (-3.75, 0.0, 0.0);
    glMaterialfv(GL_FRONT, GL_AMBIENT, mat_ambient);
    glMaterialfv(GL_FRONT, GL_DIFFUSE, mat_diffuse);
    glMaterialfv(GL_FRONT, GL_SPECULAR, no_mat);
    glMaterialfv(GL_FRONT, GL_SHININESS, no_shininess);
    glMaterialfv(GL_FRONT, GL_EMISSION, no_mat);
    glutSolidSphere(1.0, 16, 16);
    glPopMatrix();
    //   绘制第二行第二列的球体,有环境光、漫反射和镜面反射光,低光泽度
    glPushMatrix();
    glTranslatef (-1.25, 0.0, 0.0);
    glMaterialfv(GL_FRONT, GL_AMBIENT, mat_ambient);
    glMaterialfv(GL_FRONT, GL_DIFFUSE, mat_diffuse);
    glMaterialfv(GL_FRONT, GL_SPECULAR, mat_specular);
    glMaterialfv(GL_FRONT, GL_SHININESS, low_shininess);
    glMaterialfv(GL_FRONT, GL_EMISSION, no_mat);
    glutSolidSphere(1.0, 16, 16);
    glPopMatrix();
    //   绘制第二行第三列的球体,有环境光、漫反射和镜面反射光,高光泽度
    glPushMatrix();
    glTranslatef (1.25, 0.0, 0.0);
    glMaterialfv(GL_FRONT, GL_AMBIENT, mat_ambient);
    glMaterialfv(GL_FRONT, GL_DIFFUSE, mat_diffuse);
    glMaterialfv(GL_FRONT, GL_SPECULAR, mat_specular);
    glMaterialfv(GL_FRONT, GL_SHININESS, high_shininess);
    glMaterialfv(GL_FRONT, GL_EMISSION, no_mat);

2010年11月27日 09点11分 10
level 1
    glutSolidSphere(1.0, 16, 16);
    glPopMatrix();
    //   绘制第二行第四列的球体,有环境光、漫反射和发射光,无镜面反射光
    glPushMatrix();
    glTranslatef (3.75, 0.0, 0.0);
    glMaterialfv(GL_FRONT, GL_AMBIENT, mat_ambient);
    glMaterialfv(GL_FRONT, GL_DIFFUSE, mat_diffuse);
    glMaterialfv(GL_FRONT, GL_SPECULAR, no_mat);
    glMaterialfv(GL_FRONT, GL_SHININESS, no_shininess);
    glMaterialfv(GL_FRONT, GL_EMISSION, mat_emission);
    glutSolidSphere(1.0, 16, 16);
    glPopMatrix();
    //   绘制第三行第一列的球体,有颜色环境光、漫反射,无镜面反射光
    glPushMatrix();
    glTranslatef (-3.75, -3.0, 0.0);
    glMaterialfv(GL_FRONT, GL_AMBIENT, mat_ambient_color);
    glMaterialfv(GL_FRONT, GL_DIFFUSE, mat_diffuse);
    glMaterialfv(GL_FRONT, GL_SPECULAR, no_mat);
    glMaterialfv(GL_FRONT, GL_SHININESS, no_shininess);
    glMaterialfv(GL_FRONT, GL_EMISSION, no_mat);
    glutSolidSphere(1.0, 16, 16);
    glPopMatrix();
    //   绘制第三行第二列的球体,有颜色环境光、漫反射和无镜面反射光,无光泽度
    glPushMatrix();
    glTranslatef (-1.25, -3.0, 0.0);
    glMaterialfv(GL_FRONT, GL_AMBIENT, mat_ambient_color);
    glMaterialfv(GL_FRONT, GL_DIFFUSE, mat_diffuse);
    glMaterialfv(GL_FRONT, GL_SPECULAR, mat_specular);
    glMaterialfv(GL_FRONT, GL_SHININESS, low_shininess);
    glMaterialfv(GL_FRONT, GL_EMISSION, no_mat);
    glutSolidSphere(1.0, 16, 16);
    glPopMatrix();
    //   绘制第三行第三列的球体,有颜色环境光、漫反射和镜面反射光,高光泽度
    glPushMatrix();
    glTranslatef (1.25, -3.0, 0.0);
    glMaterialfv(GL_FRONT, GL_AMBIENT, mat_ambient_color);
    glMaterialfv(GL_FRONT, GL_DIFFUSE, mat_diffuse);
    glMaterialfv(GL_FRONT, GL_SPECULAR, mat_specular);
    glMaterialfv(GL_FRONT, GL_SHININESS, high_shininess);
    glMaterialfv(GL_FRONT, GL_EMISSION, no_mat);
    glutSolidSphere(1.0, 16, 16);
    glPopMatrix();
    //   绘制第三行第四列的球体,有颜色环境光、漫反射和发射光,无镜面反射光
    glPushMatrix();
    glTranslatef (3.75, -3.0, 0.0);
    glMaterialfv(GL_FRONT, GL_AMBIENT, mat_ambient_color);
    glMaterialfv(GL_FRONT, GL_DIFFUSE, mat_diffuse);
    glMaterialfv(GL_FRONT, GL_SPECULAR, no_mat);
    glMaterialfv(GL_FRONT, GL_SHININESS, no_shininess);
    glMaterialfv(GL_FRONT, GL_EMISSION, mat_emission);
    glutSolidSphere(1.0, 16, 16);
    glPopMatrix();
    glFlush();
}
void reshape(int w, int h)
{
    glViewport(0, 0, w, h);
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    if (w <= (h * 2))
       glOrtho (-6.0, 6.0, -3.0*((GLfloat)h*2)/(GLfloat)w,
          3.0*((GLfloat)h*2)/(GLfloat)w, -10.0, 10.0);
    else
       glOrtho (-6.0*(GLfloat)w/((GLfloat)h*2),
          6.0*(GLfloat)w/((GLfloat)h*2), -3.0, 3.0, -10.0, 10.0);
    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();
}
void keyboard(unsigned char key, int x, int y)
{
    switch (key) {
       case 27:     exit(0);      break;
}}
int main(int argc, char** argv)
{
    glutInit(&argc, argv);
    glutInitDisplayMode (GLUT_SINGLE | GLUT_RGB | GLUT_DEPTH);
    glutInitWindowSize (600, 450);
    glutCreateWindow(argv[0]);
    init();
    glutReshapeFunc(reshape);
    glutDisplayFunc(display);
    glutKeyboardFunc (keyboard);
    glutMainLoop();
    return 0;
}

2010年11月27日 09点11分 11
level 1
[瞌睡]
看着好困
2010年12月29日 08点12分 16
1