opengl项目一实验报告

Opengl项目一

一、题目分析

利用OpenGL绘制一个简单的场景

– 包含球、正方形、网格数据

– 交互操作:平移、缩放、旋转

– 可以使用不同的灯光

? 项目1作业上交内容 项目作 交内容

– 代码

– 报告

? 简要介绍项目的开发情况

? 场景介绍,不同的场景要有不同的图支持

? 操作介绍,不同的操作要有操作后的图支持

? 灯光介绍,不同的灯光要有不同灯光下的图支持

对 GL的理解

二、场景介绍

开始:

开灯:

旋转:

移动:

放大:

缩小:

三、代码

#include "stdafx.h"

int _tmain(int argc, _TCHAR* argv[])

{

    return 0;

}

#include <windows.h>

#include <GL/glut.h>

    float m_xRotation;

    float m_yRotation;

    float m_xTranslation;

    float m_yTranslation;

    float m_zTranslation;

    float m_xScaling;

    float m_yScaling;

    float m_zScaling;

   

    static int cpt1=45;    //定义自转角度

    static int cpt2=45;    //定义公转的?度

    BOOL bColorMaterial = FALSE;//颜色跟踪Á模式

void InitGeometry()

{

    m_xRotation=0.0;//初始时不旋转也不平移除了沿轴也不缩放

    m_yRotation=0.0;

    m_xTranslation=3.0;

    m_yTranslation=4.0;

    m_zTranslation=-1.0;

    m_xScaling=1.0;

    m_yScaling=1.0;

    m_zScaling=1.0;

}

void SetupRC(void)

{

    //全局光照系数

   GLfloat globel_ambient[] = { 0.1 , 0.1, 0.2 , 0.0 };

   //打开全局光照?

   glLightModelfv(GL_LIGHT_MODEL_AMBIENT , globel_ambient);

    glEnable(GL_LIGHTING);

    glEnable(GL_DEPTH_TEST);

    glClearColor(0.0f, 0.0f, 0.0f, 1.0f);

   

}

void ChangeSize(GLsizei w, GLsizei h)

{

    if(h == 0)      h = 1;

   

   glViewport(0, 0, w, h);

   

    glMatrixMode(GL_PROJECTION);

    glLoadIdentity();

   

   if (w <= h)

        glOrtho (-1.5, 1.5, -1.5*(GLfloat)h/(GLfloat)w, 1.5*(GLfloat)h/(GLfloat)w, -10.0, 10.0);

    else

        glOrtho (-1.5*(GLfloat)w/(GLfloat)h, 1.5*(GLfloat)w/(GLfloat)h, -1.5, 1.5, -10.0, 10.0);

    glMatrixMode(GL_MODELVIEW);

    glLoadIdentity();

    gluPerspective(60.0, (GLfloat) w/(GLfloat) h, 1.0, 20.0);

   // 重置坐标系统使投影变换复位?

      glMatrixMode(GL_MODELVIEW);

    glLoadIdentity();

    //定义视景转换前3个参数表示视点的空间位置中间个参数表示参考点的空间位置最后

    //个参数表示向上向量的方向

    gluLookAt (0.0, 0.0, 5.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0);

}

void RenderScene(void)

{

    float i;

    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

    //glLoadIdentity();

    glPushMatrix();

    glTranslatef(0.0,0.0,0.0);

    glRotatef ((GLfloat) cpt1, -1.0, 1.0, 1.0); //ball自转轴的偏转角度

    glutSolidSphere(0.6,40,40);

    glPopMatrix();

    glLightModeli(GL_LIGHT_MODEL_TWO_SIDE, GL_TRUE);

    glRectf(-1.0,-1.0,1.0,1.0);//正方形

    for(i=-100.0f;i<=100.0f;i=i+0.2f)

     {

        glBegin(GL_LINES);

          glVertex2f(i,-100.0f);

          glVertex2f(i,100.0f);

        glEnd();

        glBegin(GL_LINES);

          glVertex2f(-100.0f,i);

          glVertex2f(100.0f,i);

        glEnd();

     }

   

   

    //开启双面光照?

    glLightModeli(GL_LIGHT_MODEL_TWO_SIDE, GL_TRUE);

    glutSwapBuffers();     // 刷新命令缓冲区

    glFlush();

}

   

void display(int value)

{

    switch (value)

    {

    case 1:{

    GLfloat mat_ambient[]= { 0.2f, 0.2f, 0.2f, 1.0f };

    GLfloat mat_diffuse[]= { 1.0f, 0.6f, 1.0f, 1.0f };

    GLfloat mat_specular[] = { 0.8f, 1.0f, 1.0f, 1.0f };

    GLfloat mat_shininess[] = { 50.0f };

    GLfloat mat_emission[]={0.3f, 0.2f, 0.1f, 0.0f};

   

    GLfloat light0_diffuse[]= { 0.8f, 0.1f, 0.4f, 1.0f};

    GLfloat light0_position[] = { 1.0f, 0.8f, 0.5f, 0.0f };

    GLfloat light0_ambient[]= { 0.2f, 0.2f, 0.2f, 1.0f };

    GLfloat light0_specular[] = { 1.0f, 0.6f, 0.6f, 1.0f };

    GLfloat light1_ambient[]= { 0.2f, 0.5f, 0.2f, 1.0f };

    GLfloat light1_specular[] = { 1.0f, 0.6f, 0.6f, 1.0f };

    GLfloat light1_diffuse[]= { 0.3f, 1.0f, 0.1f, 1.0f };

    GLfloat light1_position[] = { -3.0f, -3.0f, 3.0f, 1.0f };

    GLfloat spot_direction[]={ 1.0f, 1.0f, -2.0f};

    //定义材质属性?

    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,mat_shininess);

    glMaterialfv(GL_FRONT, GL_EMISSION, mat_emission);

    //light0为漫反射的READ色点光源

    glLightfv(GL_LIGHT0, GL_DIFFUSE, light0_diffuse);

    glLightfv(GL_LIGHT0, GL_POSITION,light0_position);

    glLightfv(GL_LIGHT0, GL_AMBIENT, light0_ambient);

    glLightfv(GL_LIGHT0, GL_SPECULAR,light0_specular);

   

    //light1为BLUE聚光光源

    glLightfv(GL_LIGHT1, GL_AMBIENT, light1_ambient);

    glLightfv(GL_LIGHT1, GL_SPECULAR,light1_specular);

    glLightfv(GL_LIGHT1, GL_DIFFUSE, light1_diffuse);

    glLightfv(GL_LIGHT1, GL_POSITION,light1_position);

    glLightf (GL_LIGHT1, GL_SPOT_CUTOFF, 30.0);

    glLightfv(GL_LIGHT1, GL_SPOT_DIRECTION,spot_direction);

    glEnable(GL_LIGHTING);

    glEnable(GL_LIGHT0);

    glEnable(GL_LIGHT1);

    glEnable(GL_DEPTH_TEST);

    break;}

           //开灯

    case 2:{

    glEnable(GL_LIGHTING);

    glDisable(GL_LIGHT0);

    glDisable(GL_LIGHT1);

    glEnable(GL_DEPTH_TEST);

    break;}

           //关灯

    case 3:{

           glTranslatef(2.0,1.0, 1.0);

           break;

    //移动

           }

    case 4:{

           glScalef(2.0,2.0,2.0);

           break;

           }

           //放大

    case 5:{

           glScalef(0.1,0.1,0.1);

           break;

           }

           //缩小

}

}

 void right_menu(int id)

{

 switch(id)

 {

    case 1:

        display(1);

    break;

    case 2:

        display(2);

    break;

    case 3:

        display(3);

        break;

    case 4:

        display(4);

        break;

    case 5:

        display(5);

        break;

    default:

    break;

    }

    glutPostRedisplay();

}

void main(void)

{

    glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);

    glutInitWindowSize(600,400);

    glutInitWindowPosition(300,300);

    glutCreateWindow("opengl项目一");

    glutDisplayFunc(RenderScene);

    glutReshapeFunc(ChangeSize);

   

   

     glutCreateMenu(right_menu);

     glutAddMenuEntry("开灯",1);

     glutAddMenuEntry("灯",2);

     glutAddMenuEntry("移动",3);

     glutAddMenuEntry("放大",4);

     glutAddMenuEntry("缩小",5);

     glutAttachMenu(GLUT_RIGHT_BUTTON);

    SetupRC();

    glutMainLoop();

}

四、对GL的理解

通过这段时间对OPENGL的学习,我发现虽然GL不需要太复杂的语言,不过想要真正学好它还是非常不容易的。

OpenGL(全写Open Graphics Library)是个定义了一个跨编程语言、跨平台的编程接口的规格,它用于三维图象(二维的亦可)。OpenGL是个专业的图形程序接口,是一个功能强大,调用方便的底层图形库。

 

第二篇:opengl实验报告

贵州大学实验报告

学院:计算计科学与信息学院    专业:     班级:

贵州大学实验报告

学院:计算计科学与信息学院    专业:数字媒体技术    班级:数媒091

贵州大学实验报告

学院:计算计科学与信息学院    专业:数字媒体技术    班级:数媒091

相关推荐