资源简介
通过鼠标坐标的改变控制摄像头视角的变化 , 从而得到不同角度的画面(支持不透明度的改变 光照)

代码片段和文件信息
#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调用
相关资源
- 易语言播放器组件无缝转换(Demo2.e)
- OpenGL参考手册
- cc2541 BLE DEMO
- stm32f030 IAP Demo(原创)
- Qt Creator opengl实现四元数鼠标控制轨迹
- OpenGL文档,api大全,可直接查询函数
- opengl轮廓字体源代码
- MFC读三维模型obj文件
- 利用OpenGL写毛笔字算法
- MFC中OpenGL面和体的绘制以及动画效果
- 代码客:G-TcpServer(IOCP) 1.0 正式版及
- 基于OPENGL的光线跟踪源代码368758
- VC 实现三维旋转(源码)
- CListCtrlExDemo.rar
- 自编用openGL实现3D分形树,分形山
- OpenGL球形贴图自旋程序
- OpenGL导入贴图的Texture类
- 计算机图形学(openGL)代码
- 用OpenGL开发的机械臂运动仿真程序(
- OpenGL-3D坦克模拟
- 易语言-海康威视SDK-DEMO
- OPENGL实现世界上最小的3D游戏
- ssm框架登录注册demo
- RK3399 DEMO官方原厂 PCB 原理图以及周边
- MQTT推送Demo
- 微信小程序驾照考试题库demo完整
- redisson的demo
- bootstrap demo 源码大全
- springboot+rabbitmq项目demo(亲测可正常运
- 美松打印机SDK MsPrintSDK-Demo-DLL-CShare-
评论
共有 条评论