效果:
由於上傳大小的限制,只能製作短暫的效果。
在開始前,你應該在pro中新增
libs
+=glut.libglut32.lib
同時你也應該將這兩個庫加到qt的bin目錄下。
glwidget.h
#ifndef glwidget_h
#define glwidget_h
#include #include namespace ui
class glwidget : public qglwidget
;#endif // glwidget_h
glwidget.cpp
#include "glwidget.h"
#include "ui_glwidget.h"
#include #include #include #include const int num = 50;
typedef struct
stars;
stars star[num];
glfloat light_ambient[4]=;
glfloat light_diffuse[4]=;
glfloat light_position[4]=;
glwidget::glwidget(qglwidget *parent) :
qglwidget(parent),
ui(new ui::glwidget)
//這是對虛函式,這裡是重寫該函式
void glwidget::initializegl()
}void glwidget::paintgl()
/*不閃爍時*/
glrotatef(spin, 0.0, 0.0, 1.0);//星星沿z軸自轉spin度
glcolor4ub(star[loop].r, star[loop].g, star[loop].b, 255);//採用的是自己的顏色,完全不透明
glbegin(gl_quads);
gltexcoord2f(0.0, 0.0);
glvertex3f(-1.0, -1.0, 0.0);
gltexcoord2f(1.0, 0.0);
glvertex3f(1.0, -1.0, 0.0);
gltexcoord2f(1.0, 1.0);
glvertex3f(1.0, 1.0, 0.0);
gltexcoord2f(0.0, 1.0);
glvertex3f(-1.0, 1.0, 0.0);
glend();
spin += 0.01f;
star[loop].angle += float(loop)/num;//角度是在慢慢增大的
star[loop].dist -= 0.01f;//距離慢慢減小,被吸向了螢幕中心
if(star[loop].dist < 0)
}}//該程式是設定opengl場景透檢視,程式中至少被執行一次(程式啟動時).
void glwidget::resizegl(int width, int height)
void glwidget::keypressevent(qkeyevent *e)
else
updategl();
break;
/*pageup鍵為將木箱移到螢幕內部方向*/
case qt::key_pageup:
zoom -= 0.2;
updategl();
break;
/*pagedown鍵為將木箱移到螢幕外部方向*/
case qt::key_pagedown:
zoom += 0.2;
updategl();
break;
/*up鍵為加快立方體旋轉的速度*/
case qt::key_up:
title += 0.5;
updategl();
break;
/*down鍵為減慢立方體旋轉的速度*/
case qt::key_down:
title -= 0.5;
updategl();
break;
/*f1鍵為全屏和普通屏顯示切換鍵*/
case qt::key_f1:
fullscreen = !fullscreen;
if(fullscreen)
showfullscreen();
else
updategl();
break;
/*ese為退出程式鍵*/
case qt::key_escape:
close();
}}/*裝載紋理*/
void glwidget::loadgltextures()
tex = converttoglformat(buf);//將qt的格式buf轉換成opengl的格式tex
glgentextures(1, &texture[0]);//開闢3個紋理記憶體,索引指向texture[0]
/*建立第乙個紋理*/
glbindtexture(gl_texture_2d, texture[0]);//將建立的紋理記憶體指向的內容繫結到紋理物件gl_texture_2d上,經過這句**後,以後對
//gl_texture_2d的操作的任何操作都同時對應與它所繫結的紋理物件
glteximage2d(gl_texture_2d, 0, 3, tex.width(), tex.height(), 0, gl_rgba, gl_unsigned_byte, tex.bits());//開始真正建立紋理資料
gltexparameteri(gl_texture_2d, gl_texture_min_filter, gl_linear);//當所顯示的紋理比載入進來的紋理小時,採用gl_nearest的方法來處理
//gl_nearest方式速度非常快,因為它不是真正的濾波,所以占用記憶體非常
// 小,速度就快了
gltexparameteri(gl_texture_2d, gl_texture_mag_filter, gl_linear);//當所顯示的紋理比載入進來的紋理大時,採用gl_nearest的方法來處理
}void glwidget::timerevent(qtimerevent *)
glwidget::~glwidget()
opengl三維程式設計
void gluperspective gldouble fovy,gldouble aspect,gldouble znear,gldouble zfar 引數fovy定義視野在x z平面的角度取值是 0.0,180.0 引數aspect是投影平面寬度與高度的比率 引數znear和zfar分別是近...
opengl三維觀察
1.相機 產生目標場景檢視的變換過程類似於用照相機進行拍照。用照相機進行拍照的步驟大致如下 把照相機固定在三腳架上,並讓它對準場景 檢視變換 對場景進行安排,使各個物體在 中的位置是我們所希望的 模型變換 選擇照相機鏡頭,並調整放大倍數 投影變換 確定最終 的大小 視口變換 完成這些步驟之後,就可以...
談談三維旋轉
進行三維軟體的開發,旋轉是必不可少而且非常重要的一部分.下面談談我對旋轉的理解,偶的文字表述能力非常差,如果你覺得表述有問題,請無視.旋轉有兩種方式 旋轉場景或物件,旋轉攝像機.1.旋轉場景或物件.這是對場景或物件直接操作,操作之後物體的座標值在應用矩陣後是發生了變化的.可用圖形開發庫提供的命令執行...