OpenGL绘制简单场景,实现旋转缩放平移和灯光效果

本项目实现了用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);

平移前后如图所示

缩放操作

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

缩放后如下图

灯光介绍

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轴正方向移动坐标系,不断绘制正方体,就能有平移的效果。

时间: 2024-10-09 07:14:09

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

[ html canvas 旋转 缩放 平移 ] canvas绘图实现旋转复制实例演示

<!DOCTYPE html> <html lang='zh-cn'> <head> <title>Insert you title</title> <meta name='description' content='this is my page'> <meta name='keywords' content='keyword1,keyword2,keyword3'> <meta http-equiv="

Unity3d 简单实现物体旋转缩放移动

由于项目运行在安卓上,运用到了插件,比较麻烦.你们可以在触发条件上进行修改,不用插件也可以. 1.下载FingerGestures 插件 下载地址 点击打开链接 2.导入插件,创建场景 将预设Finger Gestures Initializer 拖拽到 Hierarchy 视图中 3.添加脚本,拖拽到摄像机上.创建一个方块拖拽到脚本target 属性上. using UnityEngine; using System.Collections; public class ObjectContro

android游戏开发5-10 补间动画 透明度渐变 旋转 缩放 平移

首先在res文件下新建anim文件夹 新建anim_alpha.xml代码如下: <?xml version="1.0" encoding="utf-8"?> <set xmlns:android="http://schemas.android.com/apk/res/android"> <alpha android:duration="2000" android:fillAfter="

OpenGL绘制简单的参数曲线——三阶Bezier曲线(二)

今天我们来介绍三次Bezier曲线,这曲线网上资料非常多,我这里只是简单介绍下原理. 在二维空间中(三维也类似),给定n+1个点P0.P1.... .Pn.参数t的n次的Bezier曲线是: 图1 我们根据上面式子可以推出一阶.二阶.三阶贝塞尔曲线,下面是一阶贝塞尔曲线: 图2 下面是二阶贝塞尔曲线,表示的是从P0P1线段取Q0,P1P2线段取Q1,每一个Q0Q1都是曲线的切向量: 图3 下面是三阶贝塞尔曲线,表示的是从P0P1线段取Q0,P1P2线段取Q1,P2P3线段取Q2,再从Q0Q1取R

OpenGL绘制简单的参数曲线——两点三次Hermite曲线(一)

网上这类曲线绘制的文章非常多,但是大多都是代码一贴就完事了,甚至连参数怎么调也没说清楚.我翻阅了不少资料,这里做个汇总,主要也就介绍一下几类简单的曲线绘制,如Hermite曲线.Bezier曲线等.今天先说说Hermite曲线,基本上最常见的就是两点三次的Hermite曲线了. 按照惯例,我们先来介绍一下Hermite曲线的原理.Hermite曲线是给定曲线段的两个端点坐标以及两端点处的切线矢量来描述的曲线.平面上一条三次参数曲线可以表示为: 图1 空间Hermite曲线跟上述类似,只是加一个z

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

编辑器 vs2012 1 #include <windows.h> 2 #include <GL/glut.h>//本来OpenGL程序一般还要包含<GL/gl.h>和<GL/glu.h>, 3 //但GLUT的头文件中已经自动将这两个文件包含了,不必再次包含. 4 #include <math.h> 5 #include<time.h> 6 7 const GLfloat Pi = 3.1415926536; 8 const GLf

【WebGL初学系列之五】旋转,平移,缩放

nbcoder.com地址:http://nbcoders.com/webgl-chu-xue-xi-lie-zhi-wu-ai.html 最近把WebGL做的相关Demo已经放在 http://www.nbcoders.com 上了,这样就可以直观的进行看效果. 地址:    http://lab.nbcoders.com/ixshells/ 本文旋转平移缩放Demo的地址: http://lab.nbcoders.com/ixshells/Html/ScaleRotateTranslate.

Assignment 4 OpenGL中正十二面体追踪球实现(平移、旋转、多面体线框体切换)

一.使用平台    windows  8.1     visual  studio  2012    二.使用方法     鼠标左键控制旋转,鼠标右键控制平移,点击鼠标中键出现菜单可选多面体 或线框体绘制.     键盘↑↓←→控制平移,F1 和 F2 键分别为多面体和线框体绘制的切换.  三.实现简述     主函数  在 main 函数中与这次实验相关的主要有以下几个函数:  glutReshapeFunc(myReshape);  //窗口改变时重新设

【安卓】自定义基于onDraw的任意动画(不仅仅是平移/旋转/缩放/alpha)、!

思路: 1.基于时间的显示映射.如:给定度数,显示圆弧,加上时序,即可有圆弧动画的效果 2.给定时序.用于驱动动画的一帧帧绘制 方案一.基于ObjectAnimator.动画运作时会调用degree对应set函数(基于放射调用),即setDegree. ObjectAnimator ani=ObjectAnimator.ofInt(myView, "degree", 0,300); ani.start(); 注:1>混编后,默认会将setDegree混掉,导致找不到函数,故混编后