PyOpenGL:是一個呼叫OpenGL的2D/3D的python圖形庫
文章推薦指數: 80 %
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後的兒子有什麼不同呢?
兒子讓我聽一首足球歌,還真好聽,我一查發現竟是一首名曲
如果父母做到這五點,那麼孩子就會快樂呼吸,少患呼吸道疾病
延伸文章資訊
- 1PyOpenGL -- The Python OpenGL Binding
PyOpenGL is the most common cross platform Python binding to OpenGL and related APIs. The binding...
- 2PyOpenGL:是一個呼叫OpenGL的2D/3D的python圖形庫
PyOpenGL:是一個呼叫OpenGL的2D/3D的python圖形庫. 3.1.2 程式碼 #匯入OpenGL的庫,一般常規匯入下面三個模組 #調出gl函式 from OpenGL.GL i...
- 3Brief Introduction to OpenGL in Python with PyOpenGL
The easiest way to install OpenGL using Python is through the pip package manager. ... GL import ...
- 4一篇就够的超良心pyOpenGL入门教程,不香喷我! - CSDN博客
OpenGL (python版本)OpenGL是用于渲染2D、3D矢量图形的扩语言、跨平台的应用程序编程接口。这个接口由近350个不同的函数调用组成,用来从简单的图形 ...
- 5ImportError: No module named OpenGL.GL - Stack Overflow
basically you need to install opengl but the library in python is called pyopengl not opengl you ...