• 大小: 902KB
    文件类型: .zip
    金币: 1
    下载: 0 次
    发布日期: 2021-05-25
  • 语言: 其他
  • 标签: opengl  demo  

资源简介

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

资源截图

代码片段和文件信息

#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

评论

共有 条评论