现在的位置: 首页 > 综合 > 正文

opengl: — 飞机

2018年04月08日 ⁄ 综合 ⁄ 共 4499字 ⁄ 字号 评论关闭

// Ambient.c
// OpenGL SuperBible
// Beginning of OpenGL lighting sample
// Demonstrates Ambient Lighting
// Program by Richard S. Wright Jr.

/* OpenGL 超级宝典例子, 翻译*/

#include "../../Common/OpenGLSB.h" // System and OpenGL Stuff

// 旋转次数
static GLfloat xRot = 0.0f;
static GLfloat yRot = 0.0f;

// 画场景回调函数
void RenderScene(void)
    {
    // 清除颜色及深度缓冲区
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

    //保存矩阵状态
    glPushMatrix();
 //沿x=1旋转xRot角度
 glRotatef(xRot, 1.0f, 0.0f, 0.0f);
 //沿y=1旋转yRot角度
 glRotatef(yRot, 0.0f, 1.0f, 0.0f);

 // 飞机
 // 绿色
 glColor3ub(0, 255, 0);
 //画三角形
 glBegin(GL_TRIANGLES);
         //机头-绿色
         //机头下巴
            glVertex3f(0.0f, 0.0f, 60.0f);
            glVertex3f(-15.0f, 0.0f, 30.0f);
            glVertex3f(15.0f,0.0f,30.0f);

   //机头左脸
            glVertex3f(15.0f,0.0f,30.0f);
            glVertex3f(0.0f, 15.0f, 30.0f);
            glVertex3f(0.0f, 0.0f, 60.0f);

   //机头右脸
            glVertex3f(0.0f, 0.0f, 60.0f);
            glVertex3f(0.0f, 15.0f, 30.0f);
            glVertex3f(-15.0f,0.0f,30.0f);

            //机身--银色
            glColor3ub(192,192,192);

   //左侧机身
            glVertex3f(-15.0f,0.0f,30.0f);
            glVertex3f(0.0f, 15.0f, 30.0f);
            glVertex3f(0.0f, 0.0f, -56.0f);

   //右侧机身
            glVertex3f(0.0f, 0.0f, -56.0f);
            glVertex3f(0.0f, 15.0f, 30.0f);
            glVertex3f(15.0f,0.0f,30.0f); 
 
   //机身腹部
            glVertex3f(15.0f,0.0f,30.0f);
            glVertex3f(-15.0f, 0.0f, 30.0f);
            glVertex3f(0.0f, 0.0f, -56.0f);

            // 左机翼
            // 深灰
            glColor3ub(64,64,64);

   //翼展
            glVertex3f(0.0f,2.0f,27.0f);
            glVertex3f(-60.0f, 2.0f, -8.0f);
            glVertex3f(60.0f, 2.0f, -8.0f);
 
   //右机翼
            glVertex3f(60.0f, 2.0f, -8.0f);
            glVertex3f(0.0f, 7.0f, -8.0f);
            glVertex3f(0.0f,2.0f,27.0f);
 
   //左机翼
            glVertex3f(60.0f, 2.0f, -8.0f);
            glVertex3f(-60.0f, 2.0f, -8.0f);
            glVertex3f(0.0f,7.0f,-8.0f);

   
            glVertex3f(0.0f,2.0f,27.0f);
            glVertex3f(0.0f, 7.0f, -8.0f);
            glVertex3f(-60.0f, 2.0f, -8.0f);

            // 机尾
            //背鳍
            glColor3ub(255,255,0);
            glVertex3f(-30.0f, -0.50f, -57.0f);
            glVertex3f(30.0f, -0.50f, -57.0f);
            glVertex3f(0.0f,-0.50f,-40.0f);
   

            glVertex3f(0.0f,-0.5f,-40.0f);
            glVertex3f(30.0f, -0.5f, -57.0f);
            glVertex3f(0.0f, 4.0f, -57.0f);

            glVertex3f(0.0f, 4.0f, -57.0f);
            glVertex3f(-30.0f, -0.5f, -57.0f);
            glVertex3f(0.0f,-0.5f,-40.0f);

            glVertex3f(30.0f,-0.5f,-57.0f);
            glVertex3f(-30.0f, -0.5f, -57.0f);
            glVertex3f(0.0f, 4.0f, -57.0f);

            //红色机尾
            glColor3ub(255,0,0);
            glVertex3f(0.0f,0.5f,-40.0f);
            glVertex3f(3.0f, 0.5f, -57.0f);
            glVertex3f(0.0f, 25.0f, -65.0f);

            glVertex3f(0.0f, 25.0f, -65.0f);
            glVertex3f(-3.0f, 0.5f, -57.0f);
            glVertex3f(0.0f,0.5f,-40.0f);

            glVertex3f(3.0f,0.5f,-57.0f);
            glVertex3f(-3.0f, 0.5f, -57.0f);
            glVertex3f(0.0f, 25.0f, -65.0f);
 glEnd();

    glPopMatrix();

    //显示结果
    glutSwapBuffers();
    }

//初始化
void SetupRC()
    {
    //白色光强度
    GLfloat ambientLight[] = { 1.0f, 1.0f, 1.0f, 1.0f };

    glEnable(GL_DEPTH_TEST); //深度测试,背面消隐
    glEnable(GL_CULL_FACE);  //三角形里面不参与计算
    glFrontFace(GL_CCW);  //逆时针为正面

    //启动光照
    glEnable(GL_LIGHTING);  

    //设置光照模型为环境光
    glLightModelfv(GL_LIGHT_MODEL_AMBIENT,ambientLight);

    glEnable(GL_COLOR_MATERIAL); // 启动材料颜色跟踪

    //材料正面满反射
    glColorMaterial(GL_FRONT,GL_AMBIENT_AND_DIFFUSE);

    //背景颜色
    glClearColor(0.0f, 0.0f, 05.f,1.0f);
    }

void SpecialKeys(int key, int x, int y)
    {
    if(key == GLUT_KEY_UP)
        xRot-= 5.0f;

    if(key == GLUT_KEY_DOWN)
        xRot += 5.0f;

    if(key == GLUT_KEY_LEFT)
        yRot -= 5.0f;

    if(key == GLUT_KEY_RIGHT)
        yRot += 5.0f;

    if(key > 356.0f)
        xRot = 0.0f;

    if(key < -1.0f)
        xRot = 355.0f;

    if(key > 356.0f)
        yRot = 0.0f;

    if(key < -1.0f)
        yRot = 355.0f;

    glutPostRedisplay();
    }

void ChangeSize(int w, int h)
    {
    GLfloat nRange = 80.0f;
    if(h == 0)
        h = 1;

    glViewport(0, 0, w, h);

    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();

    if (w <= h)
        glOrtho (-nRange, nRange, -nRange*h/w, nRange*h/w, -nRange, nRange);
    else
        glOrtho (-nRange*w/h, nRange*w/h, -nRange, nRange, -nRange, nRange);

    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();
    }

int main(int argc, char* argv[])
    {
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH);
    glutInitWindowSize(800,600);
    glutCreateWindow("Ambient Light Jet");
    glutReshapeFunc(ChangeSize);
    glutSpecialFunc(SpecialKeys);
    glutDisplayFunc(RenderScene);
    SetupRC();
    glutMainLoop();

    return 0;
    }

 

抱歉!评论已关闭.