PyOpenGL:是一個呼叫OpenGL的2D/3D的python圖形庫

文章推薦指數: 80 %
投票人數:10人

PyOpenGL:是一個呼叫OpenGL的2D/3D的python圖形庫. 3.1.2 程式碼 #匯入OpenGL的庫,一般常規匯入下面三個模組 #調出gl函式 from OpenGL.GL import ... MdEditor PyOpenGL:是一個呼叫OpenGL的2D/3D的python圖形庫 語言:CN/TW/HK 時間 2021-04-2317:28:14 易三一世 主題: 技術 1說明1.1PyOpenGL:是一個呼叫OpenGL的2D/3D的python圖形庫。

1.2OpenGL:1.2.1OpenGraphicsLibrary,開放圖形庫或者。

1.2.2是用於渲染2D、3D向量圖形的跨語言、跨平臺的應用程式程式設計介面。

1.2.3常用於CAD、虛擬實境、科學視覺化程式和電子遊戲開發。

1.3本文講解PyOpenGL安裝和入門級使用,由淺入深,註釋詳細,一秒入門,適合收藏。

2準備2.1環境:deepin-linux作業系統,華為膝上型電腦,python3.8,微軟vscode編輯器。

2.2官網https://pypi.org/project/PyOpenGL/ https://github.com/mcfletch/pyopengl2.3安裝pipinstallPyOpenGLPyOpenGL_accelerate #本機安裝 sudopip3.8install-ihttps://pypi.tuna.tsinghua.edu.cn/simplePyOpenGLPyOpenGL_accelerate3入門教程3.1第一個視窗和顏色設定3.1.1效果圖3.1.2程式碼#匯入OpenGL的庫,一般常規匯入下面三個模組 #調出gl函式 fromOpenGL.GLimport* #調出glu函式,本程式碼未使用該組函式 #fromOpenGL.GLUimport* #調出glut函式 fromOpenGL.GLUTimport* deffirstwin(): glClear(GL_COLOR_BUFFER_BIT) #glClearColor(red,green,blue,alpha) #R值(紅色分量)、G值(綠色分量)、B值(藍色分量)和A值(alpha分量)。

#背景顏色,豔紅色 #glClearColor(1.0,0.0,1.0,1.0) #背景顏色:黑色 #glClearColor(0.0,0.0,0.0,1.0) #藍色 #glClearColor(0.0,0.0,1.0,1.0) #純紅色 #glClearColor(1.0,0.0,0.0,1.0) #glClearColor(1.0,0.0,0.0,0.0) #白色 #注意推薦A值為1 glClearColor(1.0,1.0,1.0,1.0) #重新整理 glFlush() defmain(): #glut初始化函式 glutInit() #視窗顯示模式 glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB) #初始座標位置,左上角座標為0,0, glutInitWindowPosition(50,50) #視窗大小設定 glutInitWindowSize(600,600) #視窗名稱設定 glutCreateWindow("1-firstwin") #展示顯示內容 glutDisplayFunc(firstwin) #迴圈掛起 glutMainLoop() if__name__=="__main__": main()3.2helloworld和字型3.2.1效果圖3.2.2程式碼#-*-encoding:utf-8-*- #模組匯入 fromOpenGL.GLimport* #沒有使用到該函式 #fromOpenGL.GLUimport* fromOpenGL.GLUTimport* #定義函式 defDrawText(string): forcinstring: #font字型,只支援英文 #由於是glut內建函式,功能有所限制,只能顯示英文字元,而且字型、大小都不能任意設定 ''' GLUT_BITMAP_8_BY_13 GLUT_BITMAP_9_BY_15 GLUT_BITMAP_TIMES_ROMAN_10字型:TIMES_ROMAN大小:10 GLUT_BITMAP_TIMES_ROMAN_24字型:TIMES_ROMAN大小:24 GLUT_BITMAP_HELVETICA_10 GLUT_BITMAP_HELVETICA_12 GLUT_BITMAP_HELVETICA_18 ''' #glutBitmapCharacter(GLUT_BITMAP_8_BY_13,ord(c)) glutBitmapCharacter(GLUT_BITMAP_TIMES_ROMAN_24,ord(c)) defDraw(): glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT)#清除顏色和深度快取 #設定顏色為綠色 glColor3f(0.0,1.0,0.0) #定位文字,座標位置中心位置 glRasterPos2f(0.0,0.0) ''' glRasterPos2f(x,y)其實就相當於是glVertex2f(x,y)的座標, 只是glRasterPos2f(x,y)用於顯示[字型]時設定字元的起始位置, 而glVertex2f(x,y)是繪製一個2D點 ''' #繪製文字,不支援中文 #DrawText('2-Helloworld-你好世界') DrawText('2-Helloworld') #交換快取 glutSwapBuffers() defmain(): glutInit() glutInitDisplayMode(GLUT_RGBA|GLUT_DOUBLE|GLUT_DEPTH) #視窗大小設定:寬和高 glutInitWindowSize(800,300) #視窗標題名設定 glutCreateWindow('2-Helloworld') glutDisplayFunc(Draw) glutMainLoop() if__name__=="__main__": main()4茶壺teapot4.1靜態teapot4.1.1效果圖4.1.2程式碼#靜態的茶壺:teapot-s fromOpenGL.GLimport* #fromOpenGL.GLUimport* fromOpenGL.GLUTimport* defdrawFunc(): glClear(GL_COLOR_BUFFER_BIT) #預設背景顏色為黑色 #0~1為茶壺大小倍數 glutWireTeapot(0.5) glFlush() defmain(): glutInit() glutInitDisplayMode(GLUT_SINGLE|GLUT_RGBA) glutInitWindowSize(600,600) glutCreateWindow("3-teapot-s") glutDisplayFunc(drawFunc) glutMainLoop() if__name__=="__main__": main()4.2動態teapot:旋轉茶壺,並附送其他3D模型引數4.2.1效果圖4.2.2程式碼#動態茶壺:teapot-m,旋轉茶壺 fromOpenGL.GLimport* #fromOpenGL.GLUimport* fromOpenGL.GLUTimport* defdrawFunc(): #清除之前畫面 glClear(GL_COLOR_BUFFER_BIT) glRotatef(0.1,10,5,0)#(角度,x,y,z),產生動畫add1 glutWireTeapot(0.5)#畫線框茶壺 #旋轉的3D模型:附送 #glutSolidTeapot(0.5)#畫實心茶壺 #glutWireSphere(0.5,10,10)#線框球 #glutWireCube(1)#線框立方體 #內半徑,外半徑,分成10份,分成10份 #glutWireTorus(0.2,0.4,10,10)#線框圓環;甜甜圈 #glutWireIcosahedron(void)#線框20面體 #glutWireDodecahedron(void)#線框12面體,報錯,why? #glutWireOctahedron(void)#線框8面體 #glutWireTetrahedron(void)#線框4面體 #glutWireCone(GLdoubleradius,GLdoubleheight,GLintslices,GLintstacks)#線框圓錐體 #glutWireCone(0.5,1,10,10)#線框圓錐體 #重新整理顯示 glFlush() defmain(): #使用glut初始化OpenGL glutInit() #顯示模式:GLUT_SINGLE無緩衝直接顯示|GLUT_RGBA採用RGB(A非alpha) glutInitDisplayMode(GLUT_SINGLE|GLUT_RGBA) #視窗位置及大小-生成 glutInitWindowPosition(400,200) glutInitWindowSize(600,600) glutCreateWindow("4-teapot-m") #呼叫函式繪製圖像 glutDisplayFunc(drawFunc) glutIdleFunc(drawFunc)#產生動畫函式add2 #主迴圈 glutMainLoop() if__name__=="__main__": main()5正方形和正方體5.1正方形:靜態5.1.1效果圖5.1.2程式碼#正方形 fromOpenGL.GLimport* fromOpenGL.GLUTimport* defdisplay(): glClearColor(0.0,0.0,0.0,0.0)#R,G,B=(0,0,0)=black,Alpha=0 glClear(GL_COLOR_BUFFER_BIT) #glRotatef(0.1,10,5,0)#(角度,x,y,z),產生動畫add1 glColor3f(0.0,1.0,0.0);#R,G,B=(0,1,0)=Green glRectf(-0.5,-0.5,0.5,0.5)#DrawagreenRectangle glFlush() defmain(): glutInit() glutInitDisplayMode(GLUT_SINGLE|GLUT_RGBA)#繪圖模式,單緩衝,RGBA顏色模式 glutInitWindowSize(500,500)#視窗大小 glutInitWindowPosition(100,100)#視窗位置 glutCreateWindow("square-1")#視窗標題名 glutDisplayFunc(display)#註冊用於繪圖的回撥函式 #glutIdleFunc(display)#產生動畫函式add2 glutMainLoop()#進入主迴圈,期間將執行註冊的回撥函式 if__name__=="__main__": main()5.2旋轉正方形5.2.1效果圖5.2.2程式碼:將上述程式碼的註釋去除即可add1和add2,此處省略。

5.3旋轉正方體5.3.1效果圖5.3.2程式碼一fromOpenGL.GLimport* fromOpenGL.GLUTimport* defdrawFunc(): glClear(GL_COLOR_BUFFER_BIT) glRotatef(0.1,10,5,0)#(角度,x,y,z),產生動畫add1 #自帶正方體 glutWireCube(1)#線框立方體 glFlush() defmain(): #使用glut初始化OpenGL glutInit() glutInitDisplayMode(GLUT_SINGLE|GLUT_RGBA) #視窗位置及大小 glutInitWindowPosition(400,200) glutInitWindowSize(600,600) glutCreateWindow("5-square-3") #呼叫函式繪製圖像 glutDisplayFunc(drawFunc) glutIdleFunc(drawFunc)#產生動畫函式add2 #主迴圈 glutMainLoop() if__name__=="__main__": main()5.3.3程式碼二fromOpenGL.GLimport* fromOpenGL.GLUimport* fromOpenGL.GLUTimport* #DIY自定義引數 #8個座標點:頂點 verticies=( (1,-1,-1),(1,1,-1), (-1,1,-1),(-1,-1,-1), (1,-1,1),(1,1,1), (-1,-1,1),(-1,1,1) ) #12條邊 edges=( (0,1),(0,3),(0,4), (2,1),(2,3),(2,7), (5,1),(5,4),(5,7), (6,3),(6,4),(6,7), ) defCube(): #清除之前畫面 glClear(GL_COLOR_BUFFER_BIT) glRotatef(0.1,10,5,0)#(角度,x,y,z),產生動畫add1 glBegin(GL_LINES)#glBegin和glEnd()是繪圖的必備函式 foredgeinedges: forvertexinedge: glVertex3fv(verticies[vertex]) #這個函式就是連點,這個函式執行兩次畫一條線,兩點確定一條直線,引數為三維的座標 glEnd() glFlush() defmain(): glutInit() glutInitDisplayMode(GLUT_SINGLE|GLUT_RGBA) #視窗位置及大小 glutInitWindowPosition(400,200) glutInitWindowSize(800,600) glutCreateWindow("5-square-m-diy") #display=(800,600) display=[800,600] gluPerspective(45,(display[0]/display[1]),0.5,50.0) #引數1是我們看顯示物體的遠近 #引數2是物體顯示的長寬比,和視窗長寬比相同就行 #引數3和4是z軸近和遠的裁剪面的距離 glTranslatef(0.0,0.0,-5) #Z軸就是我們眼睛到螢幕方向的軸,負是遠,正是近,其實就是讓物體相對與螢幕在XYZ各方向移動幾個距離 glRotatef(1,1,1,1) #引數1是旋轉的速度, #引數2是x,yandz的一個座標,表示從(0,0,0)點到(x,y,z)這條線為軸進行旋轉 glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT)#用來刪除就得畫面,清空畫布 #呼叫函式繪製圖像 glutDisplayFunc(Cube) glutIdleFunc(Cube)#產生動畫函式add2 #主迴圈 glutMainLoop() if__name__=="__main__": main()5.4旋轉的可變色的正方形5.4.1效果圖5.4.2程式碼fromOpenGL.GLimport* fromOpenGL.GLUTimport* importtime frommathimportsin,cos,pi k=0 n=4 #多邊形變數 R=10 #外接圓半徑 theta=0.0 #旋轉初始角度值 defRedraw(): globaln,theta,R,k glClear(GL_COLOR_BUFFER_BIT) #設定三種可變顏色 if(k==1): glColor3f(1.0,0,0)#設定紅色繪圖顏色 k=2 elif(k==2): glColor3f(0,1.0,0) k=0 else: glColor3f(1.0,1.0,0) k=1 glLineWidth(1.0) glBegin(GL_POLYGON) #開始繪製四邊形 foriinrange(n): glVertex2f(R*cos(theta+i*2*pi/n),R*sin(theta+i*2*pi/n)) glEnd() glutSwapBuffers() #雙緩衝的重新整理模式 #改變視窗大小時呼叫 defResize(w,h): globaln,theta,R glMatrixMode(GL_PROJECTION) #投影矩陣模式 glLoadIdentity() #矩陣堆疊清空 #設定裁剪視窗大小 glOrtho(-1.5*R*w/h,1.5*R*w/h,-1.5*R,1.5*R,1.0,-1.0) glViewport(0,0,w,h) #設定視區大小 glMatrixMode(GL_MODELVIEW) #模型矩陣模式 defmyidle(): globaltheta theta=theta+2.0 if(theta>=2*pi): theta=theta-2*pi glutPostRedisplay() #重畫,相當於重新呼叫Redraw(),改編後的變數得以傳給繪製函式 time.sleep(0.5) #延時0.5秒 defmain(): glutInit() glutInitWindowSize(700,700) #設定顯示模式(注意雙緩衝) glutInitDisplayMode(GLUT_DOUBLE|GLUT_RGB) glutCreateWindow("ARotatingSquare") glutDisplayFunc(Redraw) glutReshapeFunc(Resize) glutIdleFunc(myidle) glClearColor(0.0,0.0,1.0,1.0)#背景藍色 glutMainLoop() if__name__=="__main__": main() 「技術」 1000多套施工方案、技術交底啥的,中建大公司的,標準權威 Adobe以200億美元收購Figma;HawkeMedia收購營銷技術平臺Morphio 電視解析度超進化,康佳8K技術掀起幾重浪? Python如何拆分表格? 意群門窗被授予CECS《定製門窗工程技術規程》標準參編單位 webdriverAPI詳解一 重大航天技術突破:中國火箭複用技術轉入實戰,加速追趕獵鷹九號 養老院管理系統設計與實現-計算機畢業設計原始碼LW文件 js中平級陣列和樹形結構資料相互轉換 你知道Vue3中style新增了哪些特性嗎? 「其他文章」 開學季:寶寶入園,父母和幼師必備的知識之幼兒園篇 今年暑期沒有什麼娛樂,我的孩子過得一般,一個宅男少年 9個月的寶寶,媽媽給孩子吃9個大蝦 我一覺醒來,發現頭條一個規則 小學生開學季:父母老師們應該注意六點 我的非藥物失眠辦法分享 10個月的寶寶,獨自滿地跑,腿都彎了 詳細介紹python3程式碼規範,小白秒懂,適合收藏 3種python3的canny邊緣檢測之靜態,可調節和自適應 美女媽媽急了,今天來找我,原因是這些 女孩老是跌倒,10多歲時做了三次手術才矯正,我的分析 mplcyberpunk:美化matplotlib實現霓虹燈效果的python庫 今晨偶遇一個老奶奶,才知道她長壽的原因 我四十年裡遇到的老師們:教師節裡我的回憶簡錄 父與子:兒童節裡回憶我與孩子的7種親子游戲 滿山茶園插黃符,幹嘛用的,辟邪麼?我回老家祁門所見思考 十個要點,讓孩子健康、快樂、好學、懂事,做父母的應該知道 2代人的童年遊戲比較:80後的我和00後的兒子有什麼不同呢? 兒子讓我聽一首足球歌,還真好聽,我一查發現竟是一首名曲 如果父母做到這五點,那麼孩子就會快樂呼吸,少患呼吸道疾病



請為這篇文章評分?