QT與OpenGL之三維旋轉

2021-06-11 18:33:26 字數 3269 閱讀 5337

效果:

由於上傳大小的限制,只能製作短暫的效果。

在開始前,你應該在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.旋轉場景或物件.這是對場景或物件直接操作,操作之後物體的座標值在應用矩陣後是發生了變化的.可用圖形開發庫提供的命令執行...