自由落體的物理公式想必大家都清楚(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;
//定時器
//gluinttexname;
//材質路徑
gldoubledt;//間隔時間
booldirection;
//小球運動方向,向下為true
doubleg;
gluint*tex0;//紋理
qstringbmpfile;
qpointm_last;
doubledist,horizontal,vertical;
typedefstruct
b//定義儲存球體的結構
ball;
ballball;
publicslots:
voidwidget.cppupdatascene();
widget::widget(qwidget*parent)
:qglwidget(parent)
voidwidget::initializegl()
voidwidget::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();
}
voidwidget::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);
}
voidwidget::mousepressevent(qmouseevent
*e)
voidwidget::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...