本项目实现了用OpenGL绘制一个简单场景,包括正方体、球体和网格,实现了物体的旋转、缩放、平移和灯光效果。附有项目完整代码。有具体凝视。适合刚開始学习的人熟悉opengl使用。

开发情况

开发环境VS2012+OpenGL

开发平台 Intel core i5,Intel HD Graphics Family

本项目实现了绘制一个场景(包含立方体、球体、网格),对各物体实现平移、旋转、缩放功能,加入了光源并简单设置了物体材质。

本项目演示样例代码下载(里面有具体凝视)

感谢nehe的框架!

场景介绍

初始场景。在(-3.0f,-2.0f,-10.0f)处绘制了一个正方体,在(3.0f,-2.0f,-10.0f)处绘制了一个半径为2的球,在y = -3.0f平面绘制了10*10的网格线。

操作介绍

旋转操作:

GLfloat    rquad;//旋转角度

···

glRotatef(rquad,0.0f,1.0f,0.0f);//旋转变换。绕y轴

rquad-=0.1f;// 降低四边形的旋转变量

旋转后例如以下图

平移操作

glTranslatef(0.0f,-rquad/100,0.0f);

平移前后如图所看到的

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvempjY29kZXI=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">

缩放操作

glScalef(-rquad/100,-rquad/100,-rquad/100);

缩放后例如以下图

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvempjY29kZXI=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">

灯光介绍

OpenGL的光照模型是用来模拟现实生活中的光照的。它依据顶点的法线向量和光源的位置决定顶点的明暗程度。依据顶点的材质和光源中三原色的成分来决定物体将表现出如何的颜色。

调用glLightfv(GL_LIGHT0,GL_AMBIENT,@ambientLight);来设置场景的环境光。

本例中光照设置例如以下,前三位为RGB颜色,第四位为alpha

GLfloatlight_ambient[] = { 0.5, 0.5, 0.5, 1.0 };//环境光

GLfloatlight_diffuse[] = { 1.0, 1.0, 1.0, 1.0 };//漫射光

GLfloatlight_specular[] = { 0.0, 1.0, 0.0, 1.0 };//镜面光

具体代码见代码附件。加入光源后例如以下图

对OpenGL的理解

OpenGL变换实际上是通过矩阵乘法来实现。不管是移动、旋转还是缩放大小,都是通过在当前矩阵的基础上乘以一个新的矩阵来达到目的。

可是从用户的角度。更直观的感受是操作矩阵。

首先通过glMatrixMode()方法设置投影矩阵和模型观察矩阵,而后面的绘制过程,就是在模型矩阵中产生不同的点,形成各种图形,然后通过选择的投影矩阵投影到屏幕上,被我们观察到。所以对图形的各种操作也能够看成是对坐标系的变换。

以平移操作为例,使用glSolidCube(GLfloat size)方法画一个正方体,这个正方体是默认画在当前坐标系中央的,所以要移动正方体,仅仅要移动坐标系就能够。glTranslatef(0.0f,-rquad/100,0.0f);就是不断向y轴正方向移动坐标系。不断绘制正方体,就能有平移的效果。

OpenGL绘制简单场景,实现旋转缩放平移和灯光效果的更多相关文章

  1. OpenGL绘制简单的时钟(首发测试)

    #include <windows.h> #include <GL/glut.h>//本来OpenGL程序一般还要包含<GL/gl.h>和<GL/glu.h& ...

  2. Unity3d物体模型(实现旋转缩放平移自动旋转)

    基本功能实现:物体通过鼠标左键上下移动,中间键缩放.右键旋转,30秒没操作,物体自动旋转 实例代码: using UnityEngine; using System.Collections; publ ...

  3. OpenGL立方体在世界坐标系中_缩放_旋转_平移_顶点片源着色器_光照作用_棋盘纹理贴图

    读取bmp等图片格式中的像素还有难度,就先用这个棋盘图象素来弄了 代码打错一个就一直First-chance exception ,貌似还有一个要用q或者Q才能成功退出,不知道缺少哪句,我用窗口红叉退 ...

  4. 【OpenGL(SharpGL)】支持任意相机可平移缩放的轨迹球实现

    [OpenGL(SharpGL)]支持任意相机可平移缩放的轨迹球 (本文PDF版在这里.) 在3D程序中,轨迹球(ArcBall)可以让你只用鼠标来控制模型(旋转),便于观察.在这里(http://w ...

  5. Eigen库实现简单的旋转、平移操作

    本来课程要求用GUI界面来实现Eigen的旋转.平移操作的,但是接触GUI编程时间太短,虽然要求很简单,但是做了几天还是没有完成.就把命令行下面的简单的贴一下吧. main.cpp #include ...

  6. OpenGL学习-------绘制简单的几何图形

    本次课程所要讲的是绘制简单的几何图形,在实际绘制之前,让我们先熟悉一些概念. 一.点.直线和多边形我们知道数学(具体的说,是几何学)中有点.直线和多边形的概念,但这些概念在计算机中会有所不同.数学上的 ...

  7. osg矩阵变换节点-----平移旋转缩放

    osg矩阵变换节点-----平移旋转缩放 转自:http://www.cnblogs.com/ylwn817/articles/1973396.html 平移旋转缩放这个三个是osg矩阵操作中,最常见 ...

  8. osg中使用MatrixTransform来实现模型的平移/旋转/缩放

    osg中使用MatrixTransform来实现模型的平移/旋转/缩放 转自:http://www.cnblogs.com/kekec/archive/2011/08/15/2139893.html# ...

  9. OpenGL绘制自由落体小球

    OpenGL绘制自由落体小球 一.    程序运行的软硬件环境 本次设计在window10系统下进行,运用C++进行编写,在CodeBlocks环境下使用OpenGL进行设计. 所需环境配置分为2部分 ...

随机推荐

  1. Ubuntu下Geary安装

    sudo add-apt-repository ppa:yorba/ppasudo apt-get updatesudo apt-get install geary

  2. hdu 3934 Summer holiday(凸包最大内接三角形)

    求n个点能组成的最大三角形,一发旋转卡壳模板题... #include<algorithm> #include<iostream> #include<cstring> ...

  3. Struts2五、Struts1与Struts2的区别

    Struts1和Struts2的区别和对比: Action 类:  • Struts1要求Action类继承一个抽象基类.Struts1的一个普遍问题是使用抽象类编程而不是接口,而struts2的Ac ...

  4. android 混淆配置

    proguard 原理Java代码编译成二进制class 文件,这个class 文件也可以反编译成源代码 ,除了注释外,原来的code 基本都可以看到.为了防止重要code 被泄露,我们往往需要混淆( ...

  5. .NET程序员生活开始

    不知不觉,开始踏入程序员生活了!加油吧.有关Session的好文章: 最近这两天被一个Web Farm环境下的Session处理问题虐得很痛苦,网上到处找解决方案,在无意中翻看到这篇文章,感觉很不错, ...

  6. UITextField总结--博主总结的真好

    忍不住copy过来http://www.cnblogs.com/wengzilin/archive/2012/03/13/2393985.html 还有些不错的博客推荐给大家http://blog.c ...

  7. 已知w是一个大于10但不大于1000000的无符号整数,若w是n(n≥2)位的整数,则求出w的后n-1位的数。

    描述 已知w是一个大于10但不大于1000000的无符号整数,若w是n(n≥2)位的整数,则求出w的后n-1位的数.   输入 第一行为M,表示测试数据组数.接下来M行,每行包含一个测试数据. 输出 ...

  8. CSS3 transition 属性

    transition是css3中新添加的特性,在W3C标准中是这样描述的:“css的transition允许css的属性值在一定的时间内从一个状态平滑的过渡到另一个状态.这种状态可以在鼠标单击.获得焦 ...

  9. xunsearch安装与卸载

    刚接触xunsearch(迅搜)的时候,我是排斥的.排斥的原因不是因为害怕学习新技术(其实我是对心技术很感兴趣),而是因为:一方面xunsearch是国人开发的,对于国人写的开源产品,我不是太感兴趣( ...

  10. hdu 5726 GCD 倍增+ 二分

    题目链接 给n个数, 定义一个运算f[l,r] = gcd(al, al+1,....ar). 然后给你m个询问, 每次询问给出l, r. 求出f[l, r]的值以及有多少对l', r' 使得f[l, ...