opengl光照效果的三棱锥+键盘上下左右控制旋转(学习笔记-仅供参考)
生活随笔
收集整理的這篇文章主要介紹了
opengl光照效果的三棱锥+键盘上下左右控制旋转(学习笔记-仅供参考)
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
#include <windows.h>
#include <gl/gl.h>
#include <gl/glut.h>
#include<stdio.h>
// 旋轉(zhuǎn)參數(shù)
static GLfloat xRot = 0.0f;
static GLfloat yRot = 0.0f;//顏色跟蹤模式
BOOL bColorMaterial = FALSE;//初始化窗口
void SetupRC(void)
{// 窗口顏色黑色glClearColor(0.0f, 0.0f, 0.0f, 1.0f);glShadeModel(GL_FLAT);
}void ChangeSize(int w, int h)
{if (h == 0) h = 1;glViewport(0, 0, w, h);glMatrixMode(GL_PROJECTION);glLoadIdentity();if (w <= h)glOrtho(-100.0f, 100.0f, -100.0f * h / w, 100.0f * h / w, -100.0f, 100.0f);elseglOrtho(-100.0f * w / h, 100.0f * w / h, -100.0f, 100.0f, -100.0f, 100.0f);glMatrixMode(GL_MODELVIEW);glLoadIdentity();
}// 窗口內(nèi)繪圖
void RenderScene(void)
{GLfloat ambient[] = { 0.8f, 0.8f, 0.8f, 1.0f }; //環(huán)境光RGBAGLfloat material_ambient[] = { 0.75f, 0.0f, 0.0f, 1.0f };glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);glEnable(GL_DEPTH_TEST);//1.設(shè)置光照glEnable(GL_LIGHTING); //啟動(dòng)光照//glDisable(GL_LIGHTING);//關(guān)閉光照//2.設(shè)置全局環(huán)境光glLightModelfv(GL_LIGHT_MODEL_AMBIENT, ambient);/*GL_LIGHT_MODEL_AMBIENT:指定該參數(shù)后,其參數(shù)值包含四個(gè)整數(shù)或浮點(diǎn)數(shù),這些參數(shù)值指定了場(chǎng)景中RGBA值。參數(shù)值在(-1.0,1.0)之間。默認(rèn)參數(shù)值為(0.2,0.2,0.2,1.0),光線相當(dāng)暗淡。GL_LIGHT_MODEL_LOCAL_VIEWER:其參數(shù)值包含一個(gè)整數(shù)或浮點(diǎn)數(shù),指定了鏡面反射角度。默認(rèn)是為0,表示視線方向與z軸負(fù)方向平行。否則表示坐標(biāo)原點(diǎn)到Z軸負(fù)方向的鏡面反射角度。GL_LIGHT_MODEL_TWO_SIDE:其參數(shù)值包含一個(gè)整數(shù)或浮點(diǎn)數(shù),表示對(duì)多邊形進(jìn)行單面還是雙面的光照計(jì)算。默認(rèn)值為0,表示單面光照計(jì)算,并使用front材質(zhì)參數(shù),否則為雙面光照,使用back材質(zhì)參數(shù)。例如:glLightModeli(LIGHT_MODEL_TWO_SIDE,GL_TRUE);啟動(dòng)雙面光照。如果將GL_TRUE改為GL_FALSE關(guān)閉雙面光照。*///3.設(shè)置材質(zhì)屬性if (bColorMaterial){glEnable(GL_COLOR_MATERIAL); //啟動(dòng)顏色跟蹤//指定多邊形正面使用顏色跟蹤glColorMaterial(GL_FRONT, GL_AMBIENT_AND_DIFFUSE);/*void glColorMaterial(GLenum face, GLenum mode);參數(shù)face: 同glMaterial*函數(shù)的face參數(shù)參數(shù)mode: 同glMaterial*函數(shù)的pname參數(shù)*/}else{glDisable(GL_COLOR_MATERIAL); //關(guān)閉顏色跟蹤//指定多邊形正面的環(huán)境反射和漫反射值glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, material_ambient);/*void glMaterial{f,i,fv,iv}(GLenum face, GLenum pname, GLfloat param/*param);參數(shù)face:指定需要更改材質(zhì)的表面,值為以下三個(gè)取值其中之一。GL_FRONT, GL_BACK, GL_FRONT_AND_BACK參數(shù)pname:指定需要更改的表面的材質(zhì)參數(shù),取值有:GL_AMBIENT: 環(huán)境光的RGBA值,參數(shù)值在(-1.0, 1.0)之間。默認(rèn)值為(0.2, 0.2, 0.2, 1.0)。GL_DIFFUSE: 漫反射光的RGBA值,參數(shù)值在(-1.0, 1.0)之間,默認(rèn)值為(0.8, 0.8, 0.8, 1.0)。GL_SPECULAR: 鏡面光的RGBA值,參數(shù)值在(-1.0, 1.0)之間,默認(rèn)值為(0.0, 0.0, 0.0, 1.0)。GL_AMBIENT_AND_DIFFUSE: 同時(shí)設(shè)置GL_AMBIENT和GL_DIFFUSE屬性,相當(dāng)于分別使用這兩個(gè)參數(shù)調(diào)用兩次該函數(shù)。通常,GL_AMBIENT和GL_DIFFUSE取相同的值,可以達(dá)到比較真實(shí)的效果。GL_SHININESS: 該屬性稱為“鏡面指數(shù)”,取值范圍是0到128,該值說(shuō)明如何確定鏡面光亮斑的大小和聚光程度。該值越小,表示材質(zhì)越粗糙,點(diǎn)光源發(fā)射的光線照射到上面,產(chǎn)生較大的亮點(diǎn);該值越大,表示材質(zhì)越光滑,點(diǎn)光源照射到上面后,產(chǎn)生較小的亮點(diǎn)。GL_EMISSION: 散射光照(輻射光)的RGBA值,該材質(zhì)本身微微地向外發(fā)射光線,以至于眼睛可以感覺(jué)到有這樣的顏色,但光線又比較弱,不會(huì)影響到其他物體的顏色。參數(shù)值在(-1.0, 1.0)之間,默認(rèn)值為(0.0, 0.0, 0.0, 1.0)。*/}//4. 定義光源,它是一種白色的光源 GLfloat sun_light_position[] = { 0.0f, 0.0f, 0.0f, 1.0f };GLfloat sun_light_ambient[] = { 0.0f, 0.0f, 0.0f, 1.0f };GLfloat sun_light_diffuse[] = { 0.0f, 0.0f, 0.0f, 1.0f };GLfloat sun_light_specular[] = { 0.0f, 0.0f, 0.0f, 1.0f };glLightfv(GL_LIGHT0, GL_POSITION, sun_light_position);glLightfv(GL_LIGHT0, GL_AMBIENT, sun_light_ambient);glLightfv(GL_LIGHT0, GL_DIFFUSE, sun_light_diffuse);glLightfv(GL_LIGHT0, GL_SPECULAR, sun_light_specular);/*void glLight{f,i,fv,iv}(GLenum light, GLenum pname, GLfloat param/*param);參數(shù)light: 指定光源,OpenGL支持至少8種光照,值為GL_LIGHT0, GL_LIGHT1,......,GL_LIGHT7。參數(shù)pname: 指定對(duì)光源設(shè)置何種屬性,取值如下:GL_AMBIENT: 設(shè)置環(huán)境光分量強(qiáng)度,默認(rèn)值為(0.0,0.0,0.0,1.0)。GL_DIFFUSE: 設(shè)置漫反射光分量強(qiáng)度,默認(rèn)值為(1.0,1.0,1.0,1.0)。GL_SPECULAR: 設(shè)置折射光分量強(qiáng)度,默認(rèn)值為(1.0,1.0,1.0,1.0)。GL_POSITION: 設(shè)置光源位置,默認(rèn)值為(0.0,0.0,0.0,0.0)。值由4個(gè)分量組成(x,y,z,w),若第4個(gè)分量w取值為0,表示該光源位于無(wú)限遠(yuǎn)處,前3個(gè)值表示它所在的方向,此時(shí),光源稱為方向光源,發(fā)出平行光;若第4個(gè)分量w取值為1,表示指定的是離場(chǎng)景較近的光源,前3個(gè)值指定了光源的位置,這種光稱為定位光源;若第4個(gè)分量w取非零值,但不為1,則光源的位置為(x/w,y/w,z/w)。GL_SPOT_DIRECTION: 用于設(shè)置聚光燈(聚光燈只能作為定位光源),設(shè)置聚光燈光錐軸線的方向,默認(rèn)值為(0.0,0.0,-1.0),即光線指向z軸負(fù)向。GL_SPOT_EXPONENT: 用于設(shè)置聚光燈,設(shè)置聚光程度。默認(rèn)值為0,表示光照范圍內(nèi)向各方向發(fā)射的光線強(qiáng)度相同;為正數(shù)時(shí),表示光照向中央集中,正對(duì)發(fā)射方向的位置受到更多光照,其它位置受到較少光照,數(shù)值越大,聚光效果就越明顯。GL_SPOT_CUTOFF: 用于設(shè)置聚光燈,設(shè)置聚光燈的最大散布角度,即頂角值的一半,默認(rèn)值為180,即沿所有方向發(fā)射光線,還有一種默認(rèn)值的取法為(0.0,90.0)。GL_CONSTANT_ATTENUATION: 設(shè)置光的常數(shù)衰減因子,默認(rèn)值為1.0。GL_LINER_ATTENUATION: 設(shè)置光的線性衰減因子,默認(rèn)值為0.0。GL_QUADRATIC_ATTENUATION: 設(shè)置光的二次衰減因子,默認(rèn)值為0.0。參數(shù)param或*param: 指定pname的設(shè)置值或指針*/glEnable(GL_LIGHT0);//啟用光源// 旋轉(zhuǎn)圖形glPushMatrix();glRotatef(xRot, 1.0f, 0.0f, 0.0f);glRotatef(yRot, 0.0f, 1.0f, 0.0f);glFrontFace(GL_CW);//繪制三菱錐glBegin(GL_TRIANGLE_FAN);glVertex3f(0.0, 0.0, 80.0);glVertex3f(0.0, 50.0, 0.0);glColor3f(1.0, 0.0, 0.0);//紅色glVertex3f(50.0, -50.0, 0.0);glColor3f(0.0, 1.0, 0.0);//綠色glVertex3f(-50.0, -50.0, 0.0);glColor3f(0.0, 0.0, 1.0);//藍(lán)色glVertex3f(0.0, 50.0, 0.0);glEnd();glBegin(GL_TRIANGLE_FAN);glVertex3f(0.0, 50.0, 0.0);glVertex3f(50.0, -50.0, 0.0);glColor3f(1.0, 1.0, 0.0);//黃色glVertex3f(-50.0, -50.0, 0.0);glEnd();glPopMatrix();glutSwapBuffers();
}
void SpecialKeys(int key, int x, int y)
{if (key == GLUT_KEY_UP) xRot -= 5.0f;if (key == GLUT_KEY_DOWN) xRot += 5.0f;if (key == GLUT_KEY_LEFT) yRot -= 5.0f;if (key == GLUT_KEY_RIGHT) yRot += 5.0f;if (xRot > 356.0f) xRot = 0.0f;if (xRot < -1.0f) xRot = 355.0f;if (yRot > 356.0f) yRot = 0.0f;if (yRot < -1.0f) yRot = 355.0f;// 刷新窗口glutPostRedisplay();
}
void ProcessMenu(int value)
{switch (value){case 1:printf("普通材質(zhì)");bColorMaterial = FALSE;break;case 2:printf("顏色跟蹤材質(zhì)");bColorMaterial = TRUE;break;default:break;}glutPostRedisplay();
}
int main(int argc, char* argv[])
{glutInit(&argc, argv);glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB);glutCreateWindow("加光照的三菱錐圖形");glutReshapeFunc(ChangeSize);glutSpecialFunc(SpecialKeys);//對(duì)鍵盤(pán)上特殊的4個(gè)方向按鍵的響應(yīng)函數(shù)glutDisplayFunc(RenderScene);// 創(chuàng)建右鍵菜單glutCreateMenu(ProcessMenu);glutAddMenuEntry("普通材質(zhì)", 1);glutAddMenuEntry("顏色跟蹤材質(zhì)", 2);glutAttachMenu(GLUT_RIGHT_BUTTON);SetupRC();glutMainLoop();return 0;
}
總結(jié)
以上是生活随笔為你收集整理的opengl光照效果的三棱锥+键盘上下左右控制旋转(学习笔记-仅供参考)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: Python生成圣诞树
- 下一篇: 如何用不到200行代码实现经典小游戏贪吃