资源简介
通过鼠标坐标的改变控制摄像头视角的变化 , 从而得到不同角度的画面(支持不透明度的改变 光照)
代码片段和文件信息
#include “StdAfx.h“
#pragma comment(lib“opengl32.lib“)
#pragma comment(lib“glu32.lib“)
#pragma comment(lib“glaux.lib“)
#define GLUT_DISABLE_ATEXIT_HACK
#include
#include
#include
#include
#define WIDTH 400
#define HEIGHT 400
struct Point /*用于记录鼠标位置*/
{
int x;
int y;
};
Point oldpt = { -1 -1 }; /*记录鼠标的前一个位置*/
bool l_button_down = FALSE; /*记录鼠标左键按下的状态*/
bool m_button_down = FALSE; /*记录鼠标中键按下的状态*/
bool r_button_down = FALSE; /*记录鼠标右键按下的状态*/
static GLfloat angle = 0.0f;
static GLfloat angle1 = 45.0f;
static GLfloat distance = 3.0f;
static GLfloat alpha = 0.5f;
/*将球坐标转化为直角坐标,并设定为摄像机的位置*/
void SetCamera(GLfloat x GLfloat y) /*x,y 是水平方向和竖直方向的改变量*/
{
if ((angle1 + y / 100)>5.0f && (angle1 + y / 100)<175.0f)
{ /*定义竖直偏角只能在5°到175°之间*/
angle += x / 100; /*根据鼠标移动的方向设置新的球坐标*/
angle1 += y / 100;
if (angle>360.0f) angle -= 360.0f;
if (angle<0.0f) angle += 360.0f; /*将水平偏角锁定在0°到360°之间*/
//Display(); /*每次改变相机位置时重绘*/
/*当然,我画的是静态的,若景物是动态的,你必须将重绘放在空闲回调函数中*/
}
}
void myDisplay()
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
//创建透视效果视图
glMatrixMode(GL_PROJECTION);//操作投影矩阵
glLoadIdentity();//当前矩阵设置为单位矩阵
gluPerspective(60.0f 1.0f 1.0f 100.0f); //得到透视效果 (视角度数,x/y,)
glMatrixMode(GL_MODELVIEW); //操作“模型视图”矩阵
glLoadIdentity();//当前矩阵设置为单位矩阵
gluLookAt(distance*cos(angle)*sin(angle1) distance*cos(angle1) distance*sin(angle)*sin(angle1) 0.0 0.0 0.0 0.0 1.0 0.0); //摄像机位置 视角 前三个 眼睛的坐标,中间三个 拍照的物体的中心位置,后三个参数表示头顶的朝向
// 只能在视线垂直的平面转动
//定义太阳光源,它是一种白色光源
{
GLfloat sun_light_position[] = { 2.0f 2.0f 2.0f 1.0f }; //设置光源 位置(X Y Z W) (X/W Y/W Z/W)表示了光源的位置
GLfloat sun_light_ambient[] = { 0.0f 0.0f 0.0f 1.0f }; //环境光源 经过非常多次的反射后,最终遗留在整个光照环境中的强度(颜色)
GLfloat sun_light_diffuse[] = { 1.0f 1.0f 1.0f 1.0f }; //漫反射光 照射到粗糙表面时经过漫反射,所得到的光的强度 (颜色)
GLfloat sun_light_specular[] = { 1.0f 1.0f 1.0f 1.0f }; //镜面射光 照射到光滑表面时经过镜面反射,所得到的光的强度 (颜色)
glLightfv(GL_LIGHT0 GL_POSITION sun_light_position); //赋值光源
glLightfv(GL_LIGHT0 GL_AMBIENT sun_light_ambient); //赋值光源
glLightfv(GL_LIGHT0 GL_DIFFUSE sun_light_diffuse); //赋值光源
glLightfv(GL_LIGHT0 GL_SPECULAR sun_light_specular); //赋值光源
glEnable(GL_LIGHT0); //开启光源
glEnable(GL_LIGHTING); //开启光源
glEnable(GL_DEPTH_TEST); //开启光源
}
//定义太阳的材质并绘制太阳
{
//☆☆☆☆☆保存当前矩阵☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆
glPushMatrix();
GLfloat sun_mat_ambient[] = { 0.0f 0.0f 0.0f 1.0f }; //设置光线照射到该材质上,经过很多次反射后最终遗留在环境中的光线强度(颜色)
GLfloat sun_mat_diffuse[] = { 1.0f 1.0f 1.0f 1.0f }; //设置光线照射到该材质上,经过漫反射后形成的光线强度(颜色)
GLfloat sun_mat_specular[] = { 1.0f 1.0f 1.0f 1.0f }; //设置光线照射到该材质上,经过镜面反射后形成的光线强度(颜色)
GLfloat sun_mat_emission[] = { 1.0f 1.0f 1.0f 1.0f }; //OpenGL认为该材质本身就微微的向外发射光线,以至于眼睛感觉到它有这样的颜色,但这光线又比较微弱,以至于不会
属性 大小 日期 时间 名称
----------- --------- ---------- ----- ----
文件 10553 2016-03-09 23:29 cvgl.cpp
目录 0 2016-01-08 22:51 Debug\
文件 46592 2016-01-07 23:04 Debug\cvgl.exe
文件 327256 2016-01-07 23:04 Debug\cvgl.ilk
文件 683008 2016-01-07 23:04 Debug\cvgl.pdb
文件 1386496 2011-11-13 16:06 Debug\glaux.dll
文件 130048 2009-07-14 09:15 Debug\glu32.dll
文件 169984 1998-08-18 16:25 Debug\glut.dll
文件 237568 2001-11-08 02:27 Debug\glut32 (2).dll
文件 169984 1998-08-18 16:25 Debug\glut32.dll
文件 791552 2009-07-14 09:16 Debug\opengl32.dll
- 上一篇:LOF算法实现
- 下一篇:易语言动态调用DLL含内存DLL调用
相关资源
- 3D 模型OpenGL显示,旋转、缩放,平移
- 利用OpenGL和ArcGIS处理得到的坐标数据
- .Net中几个主流IOC依赖注入框架Demo
- QT绘制简单OpenGL图形
- VLC插件 网页 demo
- opengl相机类
- glut.dll和glut32.dll
- 小程序demo--左侧栏分类
- 小程序demo--登录页
- opengl渲染到纹理技术
- ztree模糊搜索demo
- 3d贪吃蛇游戏
- flask实现登陆(验证码)的demo
- Ice开发过程Demo -- 异步双向通信
- 二维码生成器demo
- 二维码解析器和移动端长按识别二位
- 微信小程序----高德地图API实现的DEM
- opengl头文件和库glut工具包
- 圆的扫描转换_计算机专业_OpenGL实验
- 微信小程序 空气质量查询
- EncryptQtDemo.rar
- CAT9555 I/O口扩展芯片Demo应用范例
-
Qt Remote ob
ject(QtRO)进程间通信De - windows内科安全与驱动开发,minifilte
- listview水平滚动条 多级动态异步加载
- flash 飞机 空战 AS3.0 案例 demo
- 百度地图简单js定位demo
- springcloud+skywalkingdemo.zip
- 用opengl编写的二十面体
- QueryTaskDemo
评论
共有 条评论