nehe opengl第四十四課:3d光暈
3d 光暈
glvector v;
// 根據當前的偏轉角旋轉視線
glrotatef(m_headingdegrees, 0.0f, 1.0f, 0.0f);
glrotatef(m_pitchdegrees, 1.0f, 0.0f, 0.0f);
// 返回模型變換矩陣
glgetfloatv(gl_modelview_matrix, matrix);
// 獲得視線的方向
m_directionvector.i = matrix[8];
m_directionvector.j = matrix[9];
m_directionvector.k = -matrix[10];
// 重置矩陣
glloadidentity();
// 旋轉場景
glrotatef(m_pitchdegrees, 1.0f, 0.0f, 0.0f);
glrotatef(m_headingdegrees, 0.0f, 1.0f, 0.0f);
// 設定當前攝像機的位置
v = m_directionvector;
v *= m_forwardvelocity;
m_position.x += v.i;
m_position.y += v.j;
m_position.z += v.k;
// 變換到新的位置
gltranslatef(-m_position.x, -m_position.y, -m_position.z);}
好了,我們現在開始吧。我將使用4個對立的紋理來製造我們的鏡頭光暈,第一和二個光暈影象被放置在光源處,第三和第四個影象將根據視點的位置和方向動態的生成。紋理的影象如下所示:
現在你在頭腦裡應該有了乙個大慨地影象了吧。我們來說說何時我們應該繪製光暈,一般來說平時我們是看不見這些光暈的,只有當我們對準光源的時候才能看見這些。所以我們首先要獲得視景體的資料,下面的函式可
以幫我們完成這個功能。
// 獲得當前視景體的6個平面方程的引數void glcamera::updatefrustum()
現在我們可以測試乙個點或圓是否在視景體內了。下面的函式可以測試乙個點是否在視景體內。
bool glcamera::pointinfrustum(glpoint p) } return(true);}
下面的函式用來測試某個點是否位於當前場景物體的前面:
bool glcamera::isoccluded(glpoint p)
我們通過檢測光源是否正對我們的視線來決定是否繪製光暈,但如果你的視點超過了光源的位置,則會發生看不見光暈的現象。為了避免這種現象,我們在移動視點的使用,也相應的移動我們的光源。為了在視點和光
源之間繪製多個光暈,我們需要計算之間的向量,下面的**完成這個功能:
//下面的函式完成具體的渲染光暈的任務void glcamera::renderlensflare()
gldisable(gl_blend );
glenable(gl_depth_test);
gldisable(gl_texture_2d); }}
好了,下面的函式用來繪製四種不同的光暈
//繪製halo形的光暈void glcamera::renderhalo(glfloat r, glfloat g, glfloat b, glfloat a, glpoint p, glfloat scale)
//繪製gloew形的光暈
void glcamera::renderglow(glfloat r, glfloat g, glfloat b, glfloat a, glpoint p, glfloat scale)
//繪製bigglow形的光暈
void glcamera::renderbigglow(glfloat r, glfloat g, glfloat b, glfloat a, glpoint p, glfloat scale)
//繪製streaks形的光暈
void glcamera::renderstreaks(glfloat r, glfloat g, glfloat b, glfloat a, glpoint p, glfloat scale)
{glpoint q[4];
q[0].x = (p.x - scale);
q[0].y = (p.y - scale);
q[1].x = (p.x - scale);
q[1].y = (p.y + scale);
q[2].x = (p.x + scale);
q[2].y = (p.y - scale);
q[3].x = (p.x + scale);
q[3].y = (p.y + scale);
glpushmatrix();
gltranslatef(p.x, p.y, p.z);
glrotatef(-m_headingdegrees, 0.0f, 1.0f, 0.0f);
glrotatef(-m_pitchdegrees, 1.0f, 0.0f, 0.0f);
glbindtexture(gl_texture_2d, m_streaktexture);
glcolor4f(r, g, b, a);
NeHe OpenGL教程 第四十四課 3D光暈
翻譯 nehe opengl 教程 前言宣告,此 nehe opengl教程系列文章由51部落格yarin 翻譯 2010 08 19 本部落格為 並稍加整理與修改。對nehe的opengl管線教程的編寫,以及yarn的翻譯整理表示感謝。nehe opengl第四十四課 3d光暈 3d 光暈 glv...
實習篇 第四十四天
昨天系統公升級,我擔心的一夜沒有睡好覺,準確的說是這一周都沒有睡個好覺,整天是提心吊膽的,順理成章的我也感冒了!有句話說的好 只有在你生病的時候最想家!但是這一次,這種感覺竟被工作上的事給壓了下去!上午來到公司就聽見經理打 說系統更改過密碼之後提示有錯誤,我隱隱約約感到有問題。果然不出所料,下午問題...
程式設計訓練第四十四期 多數元素
給定乙個大小為 n 的陣列,找到其中的多數元素。多數元素是指在陣列 現次數 大於 n 2 的元素。你可以假設陣列是非空的,並且給定的陣列總是存在多數元素。1.雜湊表 時間複雜度o n 我們遍歷陣列 nums 一次,對於 nums 中的每乙個元素,將其插入雜湊表都只需要常數時間。如果在遍歷時沒有維護最...