欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Python?OpenGL基本配置方式

 更新時(shí)間:2022年05月20日 14:34:50   作者:MIPS71  
這篇文章主要介紹了Python?OpenGL基本配置方式,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

OpenGL基本配置方式

參考:http://pyopengl.sourceforge.net

pip 安裝 PyOpenGL

pip install PyOpenGL PyOpenGL_accelerate

測試代碼

from OpenGL.GL import *
from OpenGL.GLU import *
from OpenGL.GLUT import *
 
def init():
    glClearColor(1,1,1,1)
    gluOrtho2D(-1,1,-1,1)
 
def triangle():
    glClear(GL_COLOR_BUFFER_BIT)
    glColor3f(1,0,0)
    glBegin(GL_TRIANGLES)
 
    glColor3f(1,0,0)
    glVertex2f(-1, -1)
    
    glColor3f(0,1,0)
    glVertex2f(1, -1)
    
    glColor3f(0,0,1)
    glVertex2f(0, 1)
    
    glEnd()
    glFlush()
 
def main():
    glutInit(sys.argv)
    glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB)
    glutInitWindowSize(800,600)
    glutInitWindowPosition(50,50)
    glutCreateWindow("Triangle")
    glutDisplayFunc(triangle)
    init()
    glutMainLoop()
 
if __name__ == '__main__':
    main()

運(yùn)行結(jié)果,繪制出一個(gè)彩色三角形:

Python+OpenGL庫理解及代碼應(yīng)用

1.讀取off文件

使用工具庫(GLUT)創(chuàng)建 OpenGL 應(yīng)用程序只需要四步:

(1)初始化glut庫:glutInit()

(2)創(chuàng)建glut窗口:glutCreateWindow('Quidam Of OpenGL')

(3)注冊繪圖的回調(diào)函數(shù): glutDisplayFunc(draw)

(4)進(jìn)入glut主循環(huán): glutMainLoop()

除了基本組成以外還可以:

(5)設(shè)置窗口初始顯示模式:初始化 glut 庫的時(shí)候,一般要用 glutInitDisplayMode() 來設(shè)置初始的顯示模式。例如:

glutInitDisplayMode(?GLUT_DOUBLE?|?GLUT_ALPHA?|?GLUT_DEPTH)

 (6)初始化畫布

glClearColor(0.0, 0.0, 0.0, 1.0) # 設(shè)置畫布背景色。注意:這里必須是4個(gè)參數(shù)	
glEnable(GL_DEPTH_TEST)          # 開啟深度測試,實(shí)現(xiàn)遮擋關(guān)系	
glDepthFunc(GL_LEQUAL)           # 設(shè)置深度測試函數(shù)

關(guān)于draw()函數(shù)的基本組成:

(1)清除屏幕及深度緩存

glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT) 

(2)設(shè)置投影

投影設(shè)置也是每次重繪都需要的步驟之一。glOrtho() 用來設(shè)置平行投影,glFrustum() 用來設(shè)置透視投影。這兩個(gè)函數(shù)的參數(shù)相同,都是視景體的 left / right / bottom / top / near / far 六個(gè)面。視景體的 left / right / bottom / top 四個(gè)面圍成的矩形,就是視口。near 就是投影面,其值是投影面距離視點(diǎn)的距離,far 是視景體的后截面,其值是后截面距離視點(diǎn)的距離。far 和 near 的差值,就是視景體的深度。視點(diǎn)和視景體的相對位置關(guān)系是固定的,視點(diǎn)移動時(shí),視景體也隨之移動。假設(shè) view 是視景體,width 和 height 是窗口的寬度和高度,在投影變換之前,需要先聲明是對投影矩陣的操作,并將投影矩陣單位化:

glMatrixMode(GL_PROJECTION)   ,含義為選定矩陣為模型-觀察變換 矩陣

OpenGL中的變換命令都是對當(dāng)前矩陣(當(dāng)前矩陣為以后圖形變換所要使用的矩陣)進(jìn)行操作,因此在選定可修#改矩陣后,應(yīng)首先用glLoadIdentity()命令設(shè)置當(dāng)前操作矩陣為單位矩陣

glMatrixMode(GL_PROJECTION)	
glLoadIdentity()	
if width > height:	
  k = width / height	
  glFrustum(view [0]*k, view [1]*k, view [2], view [3], view [4], view [5])	
else:	
  k = height / width	
  glFrustum(view [0], view [1], view [2]*k, view [3]*k, view [4], view [5])

 (3)設(shè)置視點(diǎn)

視點(diǎn)是和視景體關(guān)聯(lián)的概念。設(shè)置視點(diǎn)需要考慮眼睛在哪兒、看哪兒、頭頂朝哪兒,分別對應(yīng)著eye, lookat 和 eye_up 三個(gè)向量.

gluLookAt(	
       #設(shè)置相機(jī)在世界坐標(biāo)系中的位置
       eye[0], eye[1], eye[2], 	
       #相機(jī)鏡頭對準(zhǔn)的物體在世界坐標(biāo)系中的位置
       look_at[0], look_at[1], look_at[2],
	   #相機(jī)向上的方向在世界坐標(biāo)系中的方向
       eye_up[0], eye_up[1], eye_up[2]	
   )

(4)設(shè)置視口 

視口的大小和尺寸是在窗口坐標(biāo)系中進(jìn)行度量的, 默認(rèn)狀 態(tài)下其坐標(biāo)原點(diǎn)位于窗口的左下角,其尺寸與窗口的大小 相同。

#glViewport(GLint x, Glint y, Glsizei width, Glsizei height)
glViewport(0, 0, width, height)

(5)設(shè)置模型變換

模型平移、旋轉(zhuǎn)、縮放等幾何變換,需要切換到模型矩陣:

glMatrixMode(GL_MODELVIEW)	
glLoadIdentity()
#平移操作函數(shù)
glTanslate(x,y,z)
#平移,(x,y,z,1)乘以 N(4x4矩陣)進(jìn)行矩陣變換
glMultMatrixf(N)
#旋轉(zhuǎn)函數(shù),繞矢量v=(x,y,z)T逆時(shí)針方向旋轉(zhuǎn)angle指定的角度。  
glRotate(angle,x,y,z)
#縮放函數(shù)	
glScale(1.0, 1.0, 1.0)

同時(shí)使用視圖變換和模型變換,需要先調(diào)用視圖變換函數(shù),后調(diào)用模型變換函數(shù),以保證模型變換首先對物體起作用。

多種變換組合調(diào)用順序 ,寫函數(shù)的時(shí)候要注意順序,否則可能不起作用

具體代碼分析

from OpenGL.GL import *
from OpenGL.GLU import *
from OpenGL.GLUT import *
import numpy as np
 
def readOFF():
    file_path = '../off/m1.off'
    f = open(file_path, 'r', encoding='utf-8')
    lines = f.readlines()
    m = []
    n = []
    #把off文件中數(shù)據(jù)按行讀取出來,存儲到列表中,由于邊數(shù)事先看了為0,所以沒遍歷邊,如果邊不為0,記得遍歷,并在后文加上邊的繪制
    for line in lines:
        m.append(line.split())
    for i in range(len(m)):
        #跳過第一行的OFF
        if m[i][0] == 'OFF':
            continue
        #記錄定點(diǎn)數(shù),面片數(shù)和邊數(shù)
        elif i == 1:
            v_cout = int(m[i][0])
            f_count = int(m[i][1])
            e_count = int(m[i][2])
            continue
        #把字符型數(shù)據(jù)轉(zhuǎn)化為數(shù)值型數(shù)據(jù)
        else:
            for j in range(len(m[i])):
                m[i][j] = float(m[i][j])
            n.append(m[i])
    return v_cout, f_count, e_count, n
 
 
#繪畫模型
def draw():
    global angle
    #讀取OFF文件包含的頂點(diǎn),面片,邊和off文件存儲數(shù)據(jù)信息
    v_cout, f_count, e_count, n = readOFF()
    # 設(shè)置渲染背景
    glClearColor(0.0, 0.0, 0.0, 0.0)
    #清除緩存
    glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT)
    # 設(shè)置投影(透視投影)
    glMatrixMode(GL_PROJECTION)
    glLoadIdentity()
    # 投影變換
    gluPerspective(100, 1, 0.5, 100)
 
    angle += 0.05
    while angle > 360:
        angle -= 360
    glMatrixMode(GL_MODELVIEW)
    glLoadIdentity()
    # 視口變換
    glViewport(100, 100, 500, 500)
    #設(shè)置觀察變換
    #設(shè)置視點(diǎn)
    gluLookAt(
        -5, 5, 0,
        0, 0, 0,
        0, 1, 0,
    )
    #設(shè)置模型變換
    #平移
    glTranslate(1, 1, 0)
    #旋轉(zhuǎn)
    glRotatef(angle, -5, 5, 0)
    # 縮放
    glScalef(5, 5, 5)
 
    for i in range(f_count):
        #獲取頂點(diǎn)個(gè)數(shù),和頂點(diǎn)信息
        cout , a, b, c = n[v_cout + i]
        cout, a, b, c=int(cout) ,int(a) ,int(b) ,int(c)
        #得到頂點(diǎn)位置
        a1, a2, a3 = n[a]
        b1, b2, b3 = n[b]
        c1, c2, c3 = n[c]
        #繪制多面體
        glBegin(GL_POLYGON)
        glVertex3f(a1, a2, a3)
        glVertex3f(b1, b2, b3)
        glVertex3f(c1, c2, c3)
        glEnd();
    # 刷新緩存
    glFlush()
 
#關(guān)閉窗口
def close(key,x,y):
    if key==b'\x1b':
        glutDestroyWindow(win_id)
 
if __name__ == "__main__":
    angle = 0
    # 初始化glut窗口
    glutInit()
    # 設(shè)置窗口顯示模式:RGBA四通道|單緩存|深度
    glutInitDisplayMode(GLUT_RGBA | GLUT_SINGLE | GLUT_DEPTH)
    # 初始化窗口大小
    glutInitWindowSize(1000, 800)
    # 創(chuàng)建窗口
    win_id = glutCreateWindow("CUBE")
    # 設(shè)置渲染函數(shù)
    glutDisplayFunc(draw)
    # 設(shè)置窗口空閑時(shí)函數(shù)
    glutIdleFunc(draw)
    # 開啟深度測試
    glEnable(GL_DEPTH_TEST)
    # 開啟窗口主循環(huán)
    glutMainLoop()

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • Python/ArcPy遍歷指定目錄中的MDB文件方法

    Python/ArcPy遍歷指定目錄中的MDB文件方法

    今天小編就為大家分享一篇Python/ArcPy遍歷指定目錄中的MDB文件方法,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-10-10
  • Python?操作pdf?pdfplumber讀取PDF寫入Excel

    Python?操作pdf?pdfplumber讀取PDF寫入Excel

    這篇文章主要介紹了Python?操作pdf?pdfplumber讀取PDF寫入Excel,文章圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的小伙伴可以考察一下
    2022-08-08
  • 帶你從內(nèi)存的角度看Python中的變量

    帶你從內(nèi)存的角度看Python中的變量

    這篇文章主要為大家介紹了從內(nèi)存的角度看Python中的變量,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-01-01
  • 一文掌握python中的時(shí)間包

    一文掌握python中的時(shí)間包

    這篇文章主要介紹了python中的時(shí)間包,主要包括datetime時(shí)間包,獲取當(dāng)前時(shí)間,獲取時(shí)間間隔及時(shí)間對象轉(zhuǎn)時(shí)間字符串的相關(guān)知識,本文通過示例代碼給大家介紹的非常詳細(xì),需要的朋友可以參考下
    2022-08-08
  • nonebot插件之chatgpt使用詳解

    nonebot插件之chatgpt使用詳解

    這篇文章主要為大家介紹了nonebot插件之chatgpt使用詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-03-03
  • python調(diào)用Matplotlib繪制分布點(diǎn)并且添加標(biāo)簽

    python調(diào)用Matplotlib繪制分布點(diǎn)并且添加標(biāo)簽

    這篇文章主要為大家詳細(xì)介紹了python調(diào)用Matplotlib繪制分布點(diǎn)并且添加標(biāo)簽的方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-05-05
  • pytorch單維篩選 相乘的案例

    pytorch單維篩選 相乘的案例

    這篇文章主要介紹了pytorch單維篩選 相乘的案例,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-04-04
  • python 常見的反爬蟲策略

    python 常見的反爬蟲策略

    這篇文章主要介紹了python反爬蟲策略,幫助大家更好的理解和使用python 爬蟲,感興趣的朋友可以了解下
    2020-09-09
  • 海王小姐姐悄悄問我怎么在PC端登錄多個(gè)微信

    海王小姐姐悄悄問我怎么在PC端登錄多個(gè)微信

    這篇文章主要介紹了怎么在PC端登錄多個(gè)微信號,眾所周知pc端一般只能登陸一個(gè)微信號,可這年頭誰還只有一個(gè)號,又不能同時(shí)用兩臺電腦,這篇文章帶給你答案
    2021-08-08
  • Python浮點(diǎn)數(shù)取整、格式化和NaN處理的操作方法

    Python浮點(diǎn)數(shù)取整、格式化和NaN處理的操作方法

    這篇文章主要介紹了Python浮點(diǎn)數(shù)取整、格式化和NaN處理的操作方法,本文較詳細(xì)介紹了取整的三種方法,格式化浮點(diǎn)數(shù)輸出的示例代碼詳解,感興趣的朋友跟隨小編一起看看吧
    2022-05-05

最新評論