OpenGL大作业

GLfloat light0_position[] = { 15.0,15.0,15.0,10.0 };//定义光源位置 103
glLightfv(GL_LIGHT0, GL_POSITION, light0_position);//设置光源位置 107
x,y,z,w四个变量组成上面的数组,其中前三个代表位置,最后一个代表离场景近远(W可不予理会)
坐标系 右手边为x正,上方为y正,从屏幕向你为z正

gluLookAt(0.0, 0.0, 5.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0); 150
gluLookAt(
eyex,eyey,eyez, // 这里是观察者位置
targetx,targety,targetz // 这是观察者看着的那点
upx,upy,upz ) // 这是观察者头顶向着的方向

glRotatef(30.0, 1.0, 0.0, 0.0);//旋转使物体被观测的角度变化 多处出现
glRotatef( angle, x, y, z )函数的作用是将当前坐标系以a( x, y, z )向量为旋转轴旋转angle角度

glTranslatef(4.5f, 0.0f, -6.0f);//将画笔移动到另一个地点,方便绘制下一个图形 174

注意坐标系约定和函数参数单位!

实验结果图。。

核心代码

void CTribleangleView::OnDraw(CDC* pDC)
{
    CTribleangleDoc* pDoc = GetDocument();
    ASSERT_VALID(pDoc);
    if (!pDoc)
        return;

    // TODO: add draw code for native data here
    //初始化各种设置
    wglMakeCurrent(pDC->m_hDC, m_hGLRC);//将绘图上下文绑定到设备上下文上
    glClearColor(0.5, 0.5, 0.5, 0.0);//设置背景色
    glClearDepth(1.0f);//初始化深度
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);//清空缓冲区
    glEnable(GL_DEPTH_TEST);//开启深度测试
    glShadeModel(GL_SMOOTH);//平滑阴影模式
    CRect rcClient;
    GetClientRect(&rcClient);
    GLsizei w = rcClient.Width();//视区宽度
    GLsizei h = rcClient.Height();//视区高度
    glViewport(0, 0, w, h);
    glMatrixMode(GL_PROJECTION);//选择投影矩阵
    glLoadIdentity();//重置投影矩阵
    gluPerspective(60.0, (GLfloat)w / h, 0.1, 100.0);//设置投影方式及投影参数
    glMatrixMode(GL_MODELVIEW);//选择模式矩阵
    glLoadIdentity();//重置模式矩阵

    //设置光照(定义一个位于左上方的白色定位光源)
    GLfloat lmodel_ambient[] = { 1.0f,1.0f,1.0f,1.0f };//定义环境光
    glLightModelfv(GL_LIGHT_MODEL_AMBIENT, lmodel_ambient);//设置环境光
    GLfloat light0_ambient[] = { 1.0,1.0,1.0,1.0 };//定义光源环境光
    GLfloat light0_diffuse[] = { 1.0,1.0,1.0,1.0 };//定义光源散射光
    GLfloat light0_specular[] = { 1.0,1.0,1.0,1.0 };//定义光源反射光
    GLfloat light0_position[] = { 15.0,15.0,15.0,10.0 };//定义光源位置
    glLightfv(GL_LIGHT0, GL_AMBIENT, light0_ambient);//设置光源环境光
    glLightfv(GL_LIGHT0, GL_DIFFUSE, light0_diffuse);//设置光源散射光
    glLightfv(GL_LIGHT0, GL_SPECULAR, light0_specular);//设置光源反射光
    glLightfv(GL_LIGHT0, GL_POSITION, light0_position);//设置光源位置
    glEnable(GL_LIGHT0);//启用光源
    glEnable(GL_LIGHTING);//启用光照效果

                          //定义黄铜材质
    GLfloat brass_ambient[] = { 0.329412f,0.223529f,0.027451f,1.0f };//定义材质环境光
    GLfloat brass_diffuse[] = { 0.780392f,0.568627f,0.113725f,1.0f };//定义材质散射光
    GLfloat brass_specular[] = { 0.992157f,0.941176f,0.807843f,1.0f };//定义材质反射光
    GLfloat brass_sinines[] = { 100.0f };//定义材质镜面反射强度
    glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT, brass_ambient);//设置材质环境光
    glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, brass_diffuse);//设置材质散射光
    glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, brass_specular);//设置材质反射光
    glMaterialfv(GL_FRONT_AND_BACK, GL_SHININESS, brass_sinines);//设置材质镜面反射强度
                        //塑料材质
    GLfloat plastic_ambient[] = { 0.0f,0.0f,0.00f,1.0f };//定义材质环境光
    GLfloat plastic_diffuse[] = { 0.7f,0.85f,0.7f,1.0f };//定义材质散射光
    GLfloat plastic_specular[] = { 0.75f,0.75f,0.75f,1.0f };//定义材质反射光
    GLfloat plastic_sinines[] = { 10.0f };//定义材质镜面反射强度
    glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT, plastic_ambient);//设置材质环境光
    glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, plastic_diffuse);//设置材质散射光
    glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, plastic_specular);//设置材质反射光
    glMaterialfv(GL_FRONT_AND_BACK, GL_SHININESS, plastic_sinines);//设置材质镜面反射强度

    //平面纹理坐标生成
    static GLfloat xequalzero[] = { 1.0,1.0,1.0,1.0 };
    static GLfloat slanted[] = { 1.0,1.0,1.0,1.0 };
    static GLfloat *currentCoeff;
    static GLenum    currentPlane;
    static GLint    currentGenMode;
    static float    roangles;
    glClearColor(1.0, 1.0, 1.0, 1.0);
    glEnable(GL_DEPTH_TEST);
    glShadeModel(GL_SMOOTH);
#define stripleImageWidth 32
    GLubyte stripleImage[4 * stripleImageWidth];

    int j;
    for (j = 0; j < stripleImageWidth; ++j) {
        stripleImage[4 * j + 0] = (GLubyte)((j <= 4) ? 255 : 0);
        stripleImage[4 * j + 1] = (GLubyte)((j>4) ? 255 : 0);
        stripleImage[4 * j + 2] = (GLbyte)(0);
        stripleImage[4 * j + 3] = (GLbyte)255;
    }
    glPixelStoref(GL_UNPACK_ALIGNMENT,1);
    glTexParameteri(GL_TEXTURE_1D, GL_TEXTURE_WRAP_S, GL_REPEAT);
    glTexParameteri(GL_TEXTURE_1D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
    glTexParameteri(GL_TEXTURE_1D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
    glTexImage1D(GL_TEXTURE_1D, 0, 4, stripleImageWidth, 0,
        GL_RGBA, GL_UNSIGNED_BYTE, stripleImage);
    glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
    currentCoeff = xequalzero;
    currentGenMode = GL_OBJECT_LINEAR;
    currentPlane = GL_OBJECT_PLANE;
    glTexGeni(GL_S, GL_TEXTURE_GEN_MODE, currentGenMode);
    glTexGenfv(GL_S, currentPlane, currentCoeff);
    glEnable(GL_TEXTURE_GEN_S);
    glEnable(GL_TEXTURE_1D);
    glEnable(GL_LIGHTING);
    glEnable(GL_LIGHT0);
    glEnable(GL_AUTO_NORMAL);
    glEnable(GL_NORMALIZE);
    glFrontFace(GL_CW);
    glMaterialf(GL_FRONT, GL_SHININESS, 64.0);
    roangles = 45.0;
    //设置坐标系统
    glTranslatef(0.0f, -0.1f, -2.0f);//将坐标系统下移0.1,后移2.0
    glRotatef(45, 1.0, 0.0, 0.0);//将坐标系统绕x轴逆时针旋转45度
    glRotatef(30, 0.0, -1.0, 0.0);//将坐标系统绕y轴顺时针旋转30度

    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glLoadIdentity();
    glPushMatrix();
    glTranslatef(-1.5f, 0.0f, -6.0f);
    glRotatef(30.0, 1.0, 0.0, 0.0);
    glRotatef(30.0, 0.0, 1.0, 0.0);

    glutSolidCube(2.0);
    glLoadIdentity();
    glTranslatef(2.5f, 0.0f, -6.0f);
    glRotatef(0.0f, 1.0f, 0.0f, 0.0f);
    glutSolidSphere(2.0, 32, 32);
    glDisable(GL_TEXTURE_2D);//禁用纹理映射
    glPopMatrix();
    glFlush();//强制输出
    SwapBuffers(pDC->m_hDC);//交换缓冲区
    wglMakeCurrent(pDC->m_hDC, NULL);//置绘图上下文为非当前状态,释放设备上下文

}
时间: 2024-12-17 07:15:27

OpenGL大作业的相关文章

《Java语言程序设计》大作业报告 九宫格游戏

    <Java语言程序设计>大作业报告     中国石油大学(北京)2015 - 2016 学年第二学期     班级:_____计算机14-1_______ 姓名:_____  许 恺_________________ 学号:______2014011329___________     题意分析 程序首先需要九个可以移动的格子,大小相等,有字符串标示,其次要可以相应鼠标和键盘方向键的控制,可以自由移动,并且与此同时记录步数,最后在满足条件时弹出对话框并显示步数以及是否打破记录,关于打破

数据库大作业--由python+flask

这个是项目一来是数据库大作业,另一方面也算是再对falsk和python熟悉下,好久不用会忘很快. 界面相比上一个项目好看很多,不过因为时间紧加上只有我一个人写,所以有很多地方逻辑写的比较繁琐,如果是想学习flask还是推荐之前的项目,地址:http://www.cnblogs.com/INnoVationv2/p/5837495.html 寒假回去我会重构下代码,然后再po出来. 不知道怎么做数据库大作业的也可以参考: 所有功能: 三类用户模式: 一.管理员 1.查看所有档案 2.修改档案信息

机电传动控制大作业第一阶段

机电传动控制大作业第一阶段 一.系统硬件接口定义 系统硬件可分为显示部分.按键输入部分和运动控制部分. 显示部分包括每个楼层的电梯外的楼层显示LED和上下楼指示箭头.电梯内的楼层显示LED和上下楼箭头,LED显示如果用七段共阴数码管则每个LED需要七个继电器来控制显示字符,上下楼箭头每个需要两个继电器IO进行控制,而控制它们的信号源则来自每层楼的行程开关,共七个开关进行输入. 按键输入部分为电梯内和楼层中,电梯内七个常开触点输入楼层,两个常开触点控制开关门,同时需要点亮楼层按键上的指示灯,则需要

DIP大作业---图像分割

数字图像处理课程的大作业,要求如下: 图像分割就是把图像分成若干个特定的.具有独特性质的区域并提出感兴趣目标的技术和过程.它是由图像处理到图像分析的关键步骤.现有的图像分割方法主要分以下几类:基于阈值的分割方法.基于区域的分割方法.基于边缘的分割方法以及基于特定理论的分割方法等.图像分割后提取出的目标可以用于图像语义识别,图像搜索等等领域.要求1:输入一副真彩色RGB图像dog.jpg,完成对小狗的分割,输入结果为只包含小狗区域的二值图(matlab环境下,小狗区域值为1,其他区域值为0).要求

不是所有的大作业都叫微信抢票大作业

为时四周的微信抢票大作业终于接近尾声,回首这段时间,真是感慨万千.不是所有的大作业都是微信抢票大作业,能够让人同时体验产品经理.开发工程师.测试工程师.运维工程师四个角色.经过了微信抢票大作业的洗礼,才知道之前对老师上课讲的内容只是一知半解,只有实践才能出真知. 一.搞开发 讲道理,这次大作业的开发工作其实不是很多.因为框架设计的很好,接口也介绍的很详细,只需要按部就班填坑就可以达到基本要求了. 但是既然助教上课都提到了几个优化方案,比如内存型数据库,异步队列等,好奇如我怎能不试呢.于是就开始给

机电传动控制大作业 第一阶段

机电传动控制大作业 第一阶段 一.系统硬件接口定义 1.电梯内操作界面: 标有1-7数字的按钮(每个按钮有一个LED灯,按下按钮灯即亮),开门,关门以及紧急报警的按钮和楼层指示的LED数码管.电梯门的打开和关闭需要两个行程开关,接收到开关门的信息可以直接控制门的开关. 2.楼栋操作界面: 2-6层有上行和下行按钮,1层只有上行,7层只有下行.每个按钮都连接一个LED灯(按下按钮灯即亮).两个LED数码管显示所在的楼层. 3.动力相关硬件: 每部电梯配有一台交流异步变频电机和变频器,电机接口接电机

并行计算大作业之多边形相交(OpenMP、MPI、Java、Windows)

***************************************转载请注明出处:http://blog.csdn.net/lttree******************************************** 吐槽: 话说,相当郁闷,2015年,第一次打开博客,准备总结一下这一年.. 结果博客被封了= =! 今天,终于解封了,换了密码,换了密保.... 但是,写回顾的激情有点退散了.. 明后两天要上课,明天还要验收一个综合设计大作业,再后两天要考试,再后两天继续上课,

深度学习与自然语言处理(4)_斯坦福cs224d 大作业测验1与解答

深度学习与自然语言处理(4)_斯坦福cs224d 大作业测验1与解答 作业内容翻译:@胡杨([email protected]) && @胥可([email protected]) 解答与编排:寒小阳 && 龙心尘 时间:2016年6月 出处: http://blog.csdn.net/han_xiaoyang/article/details/51760923 http://blog.csdn.net/longxinchen_ml/article/details/51765

数据库终期大作业报告

需求分析 现代社会,心血管疾病成为了老年人群体中高发的慢性病,一个社区医生往往需要负责多位患者的诊断工作,如果每位患者都要频繁上门问诊,会给医生带来过大的工作压力,也很难顾及到全部患者. 在信息技术高度普及的当下,完全可以利用互联网思维解决问题,制作一个软件用于实现: l  医生随时掌握所负责病人的血压数据,并为病人提供专业诊断意见. l  病人随时上传血压数据,并从医生处获得治疗意见. 概要设计 1.数据库 数据存放在名为dochelper的MySQL数据库中. 数据库包含4张表:doctor