資源簡介
通過鼠標坐標的改變控制攝像頭視角的變化 , 從而得到不同角度的畫面(支持不透明度的改變 光照)

代碼片段和文件信息
#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調用
評論
共有 條評論