OpenGL繪製球體模擬自由落體運動(基於Qt)

2021-08-19 20:47:41 字數 3326 閱讀 7249

自由落體的物理公式想必大家都清楚(y=vt+0.5gt^2)。

但是用程式如何模擬這個過程呢?

1、其中比較關鍵的是設定乙個計時器,在乙個視覺暫留時間段(dt=0.02s)內根據小球的位置座標繪製小球。

2、在小球彈到地面的時候會因為碰撞而有能量損耗,其表現形式為速度減小並反向,而速度減小則可以通過改變加速度a的大小來控制(f=ma嘛,不知道這樣解釋合不合理,迷)

3、終止條件的判斷:

if(ball.vy

<1

&&ball.y

這裡ball.vy為速度大小,ball.y為高度座標(地面位置為-2.0),條件為什麼不是ball.vy<0呢?這是因為速度的減少或增加是以dt為單位的(非連續),不一定能取到0值,如果條件設為0那麼小球會一直在乙個很小的範圍內震動。(不信你可以試試)

下面附上我的程式實現:(因為考試複習原因沒有給小球新增紋理,後面有時間了再補上)

widget.h

qtimer

*timer;

//定時器

//gluint

texname;

//材質路徑

gldouble

dt;//間隔時間

bool

direction;

//小球運動方向,向下為true

double

g;

gluint

*tex0;//紋理

qstring

bmpfile;

qpoint

m_last;

double

dist,horizontal,vertical;

typedef

struct

b//定義儲存球體的結構

ball;

ball

ball;

public

slots:

void

updatascene();

widget.cpp

widget::widget(qwidget

*parent)

:

qglwidget(parent)

void

widget::initializegl()

void

widget::paintgl()

if(direction)

ball.y

=ball.y-(ball.vy*dt+0.5*g*dt*dt);

//根據牛頓運動定律計算出球的位移公式

ball.vy

=ball.vy

+g*dt;

//根據牛頓運動定律計算出球體的速度

}
else

ball.y

=ball.y+(ball.vy*dt-0.5*g*dt*dt);

ball.vy

=ball.vy-g*dt;

}
glpopmatrix();

//將當前矩陣彈出

glpushmatrix();
//glpushattrib(gl_all_attrib_bits);

//glcolor3f(0.0,

0.0,

1.0);

glenable(gl_texture_2d);
//loadtexture(bmpfile,tex0);

glbegin(gl_quads);
gltexcoord2f(

0.0,

0.0);glvertex3f(10.0,-4.0,0.0);

gltexcoord2f(

1.0,

0.0);glvertex3f(0.0,-4.0,-6.0);

gltexcoord2f(

1.0,

1.0);glvertex3f(-6.0,-4.0,0.0);

gltexcoord2f(

0.0,

1.0);glvertex3f(0.0,-4.0,10.0);

glend();
//glpopattrib();

glpopmatrix();
glflush();
}
void

widget::loadtexture(qstring

filepath,

gluint

*texture)

tex=converttoglformat(buf);

//轉化為rgba型別的資料集

glgentextures(1,texture);
glbindtexture(gl_texture_2d,*texture);
glubuild2dmipmaps(gl_texture_2d,

gl_rgba,tex.width(),tex.height(),

gl_rgba,

gl_unsigned_byte,tex.bits());

gltexparameteri(gl_texture_2d,

gl_texture_base_level,

0);

gltexparameteri(gl_texture_2d,gl_texture_max_level,3);
}
void

widget::mousepressevent(qmouseevent

*e)

void

widget::mousemoveevent(qmouseevent

*e)

}
執行結果截圖:

OpengL球體跳躍前進例子

include include gl glut.h include include include 引數指定正方形的位置和大小 float xsite 100.0 圓心座標 float ysite 200.0 glsizei rsize 20 正方形運動變化的步長 float xstep 2.0f ...

opengl繪製漢字

opengl本身並沒有繪製文字的功能,他只是乙個三維繪圖的api集和,很多東西都要 自己動手才可以實現。opengl繪製文字,網路上已經有很多成熟的方式方法,我這裡給 大家介紹的是我使用的方式,從繪製的效率上來說,速度上從已經達到我個人水平的最大值。首先介紹下網路上的一些繪製方式。一 將要繪製的文字...

OPENGL繪製文字

opengl沒有提供直接繪製文字的功能,需要借助於作業系統。用opengl繪製文字比較常見的方法是利用顯示列表。建立一系列顯示列表,每個字元對應乙個列表編號。例如,a 對應列表編號1000 a b 對應列表編號1000 b 以此類推。繪製乙個字串時,依次呼叫字串中每個字元所對應的列表編號。在wind...