日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

opengl光照效果的三棱锥+键盘上下左右控制旋转(学习笔记-仅供参考)

發布時間:2024/3/12 编程问答 39 豆豆
生活随笔 收集整理的這篇文章主要介紹了 opengl光照效果的三棱锥+键盘上下左右控制旋转(学习笔记-仅供参考) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
#include <windows.h> #include <gl/gl.h> #include <gl/glut.h> #include<stdio.h> // 旋轉參數 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(); }// 窗口內繪圖 void RenderScene(void) {GLfloat ambient[] = { 0.8f, 0.8f, 0.8f, 1.0f }; //環境光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.設置光照glEnable(GL_LIGHTING); //啟動光照//glDisable(GL_LIGHTING);//關閉光照//2.設置全局環境光glLightModelfv(GL_LIGHT_MODEL_AMBIENT, ambient);/*GL_LIGHT_MODEL_AMBIENT:指定該參數后,其參數值包含四個整數或浮點數,這些參數值指定了場景中RGBA值。參數值在(-1.0,1.0)之間。默認參數值為(0.2,0.2,0.2,1.0),光線相當暗淡。GL_LIGHT_MODEL_LOCAL_VIEWER:其參數值包含一個整數或浮點數,指定了鏡面反射角度。默認是為0,表示視線方向與z軸負方向平行。否則表示坐標原點到Z軸負方向的鏡面反射角度。GL_LIGHT_MODEL_TWO_SIDE:其參數值包含一個整數或浮點數,表示對多邊形進行單面還是雙面的光照計算。默認值為0,表示單面光照計算,并使用front材質參數,否則為雙面光照,使用back材質參數。例如:glLightModeli(LIGHT_MODEL_TWO_SIDE,GL_TRUE);啟動雙面光照。如果將GL_TRUE改為GL_FALSE關閉雙面光照。*///3.設置材質屬性if (bColorMaterial){glEnable(GL_COLOR_MATERIAL); //啟動顏色跟蹤//指定多邊形正面使用顏色跟蹤glColorMaterial(GL_FRONT, GL_AMBIENT_AND_DIFFUSE);/*void glColorMaterial(GLenum face, GLenum mode);參數face: 同glMaterial*函數的face參數參數mode: 同glMaterial*函數的pname參數*/}else{glDisable(GL_COLOR_MATERIAL); //關閉顏色跟蹤//指定多邊形正面的環境反射和漫反射值glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, material_ambient);/*void glMaterial{f,i,fv,iv}(GLenum face, GLenum pname, GLfloat param/*param);參數face:指定需要更改材質的表面,值為以下三個取值其中之一。GL_FRONT, GL_BACK, GL_FRONT_AND_BACK參數pname:指定需要更改的表面的材質參數,取值有:GL_AMBIENT: 環境光的RGBA值,參數值在(-1.0, 1.0)之間。默認值為(0.2, 0.2, 0.2, 1.0)。GL_DIFFUSE: 漫反射光的RGBA值,參數值在(-1.0, 1.0)之間,默認值為(0.8, 0.8, 0.8, 1.0)。GL_SPECULAR: 鏡面光的RGBA值,參數值在(-1.0, 1.0)之間,默認值為(0.0, 0.0, 0.0, 1.0)。GL_AMBIENT_AND_DIFFUSE: 同時設置GL_AMBIENT和GL_DIFFUSE屬性,相當于分別使用這兩個參數調用兩次該函數。通常,GL_AMBIENT和GL_DIFFUSE取相同的值,可以達到比較真實的效果。GL_SHININESS: 該屬性稱為“鏡面指數”,取值范圍是0到128,該值說明如何確定鏡面光亮斑的大小和聚光程度。該值越小,表示材質越粗糙,點光源發射的光線照射到上面,產生較大的亮點;該值越大,表示材質越光滑,點光源照射到上面后,產生較小的亮點。GL_EMISSION: 散射光照(輻射光)的RGBA值,該材質本身微微地向外發射光線,以至于眼睛可以感覺到有這樣的顏色,但光線又比較弱,不會影響到其他物體的顏色。參數值在(-1.0, 1.0)之間,默認值為(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);參數light: 指定光源,OpenGL支持至少8種光照,值為GL_LIGHT0, GL_LIGHT1,......,GL_LIGHT7。參數pname: 指定對光源設置何種屬性,取值如下:GL_AMBIENT: 設置環境光分量強度,默認值為(0.0,0.0,0.0,1.0)。GL_DIFFUSE: 設置漫反射光分量強度,默認值為(1.0,1.0,1.0,1.0)。GL_SPECULAR: 設置折射光分量強度,默認值為(1.0,1.0,1.0,1.0)。GL_POSITION: 設置光源位置,默認值為(0.0,0.0,0.0,0.0)。值由4個分量組成(x,y,z,w),若第4個分量w取值為0,表示該光源位于無限遠處,前3個值表示它所在的方向,此時,光源稱為方向光源,發出平行光;若第4個分量w取值為1,表示指定的是離場景較近的光源,前3個值指定了光源的位置,這種光稱為定位光源;若第4個分量w取非零值,但不為1,則光源的位置為(x/w,y/w,z/w)。GL_SPOT_DIRECTION: 用于設置聚光燈(聚光燈只能作為定位光源),設置聚光燈光錐軸線的方向,默認值為(0.0,0.0,-1.0),即光線指向z軸負向。GL_SPOT_EXPONENT: 用于設置聚光燈,設置聚光程度。默認值為0,表示光照范圍內向各方向發射的光線強度相同;為正數時,表示光照向中央集中,正對發射方向的位置受到更多光照,其它位置受到較少光照,數值越大,聚光效果就越明顯。GL_SPOT_CUTOFF: 用于設置聚光燈,設置聚光燈的最大散布角度,即頂角值的一半,默認值為180,即沿所有方向發射光線,還有一種默認值的取法為(0.0,90.0)。GL_CONSTANT_ATTENUATION: 設置光的常數衰減因子,默認值為1.0。GL_LINER_ATTENUATION: 設置光的線性衰減因子,默認值為0.0。GL_QUADRATIC_ATTENUATION: 設置光的二次衰減因子,默認值為0.0。參數param或*param: 指定pname的設置值或指針*/glEnable(GL_LIGHT0);//啟用光源// 旋轉圖形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);//藍色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("普通材質");bColorMaterial = FALSE;break;case 2:printf("顏色跟蹤材質");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);//對鍵盤上特殊的4個方向按鍵的響應函數glutDisplayFunc(RenderScene);// 創建右鍵菜單glutCreateMenu(ProcessMenu);glutAddMenuEntry("普通材質", 1);glutAddMenuEntry("顏色跟蹤材質", 2);glutAttachMenu(GLUT_RIGHT_BUTTON);SetupRC();glutMainLoop();return 0; }

總結

以上是生活随笔為你收集整理的opengl光照效果的三棱锥+键盘上下左右控制旋转(学习笔记-仅供参考)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。