Python OpenGL基本配置方式


Posted in Python onMay 20, 2022

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()

运行结果,绘制出一个彩色三角形:

Python OpenGL基本配置方式

Python+OpenGL库理解及代码应用

1.读取off文件

使用工具库(GLUT)创建 OpenGL 应用程序只需要四步:

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

(2)创建glut窗口:glutCreateWindow('Quidam Of OpenGL')

(3)注册绘图的回调函数: glutDisplayFunc(draw)

(4)进入glut主循环: glutMainLoop()

除了基本组成以外还可以:

(5)设置窗口初始显示模式:初始化 glut 库的时候,一般要用 glutInitDisplayMode() 来设置初始的显示模式。例如:

glutInitDisplayMode( GLUT_DOUBLE | GLUT_ALPHA | GLUT_DEPTH)

 (6)初始化画布

glClearColor(0.0, 0.0, 0.0, 1.0) # 设置画布背景色。注意:这里必须是4个参数	
glEnable(GL_DEPTH_TEST)          # 开启深度测试,实现遮挡关系	
glDepthFunc(GL_LEQUAL)           # 设置深度测试函数

关于draw()函数的基本组成:

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

glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)

(2)设置投影

投影设置也是每次重绘都需要的步骤之一。glOrtho() 用来设置平行投影,glFrustum() 用来设置透视投影。这两个函数的参数相同,都是视景体的 left / right / bottom / top / near / far 六个面。视景体的 left / right / bottom / top 四个面围成的矩形,就是视口。near 就是投影面,其值是投影面距离视点的距离,far 是视景体的后截面,其值是后截面距离视点的距离。far 和 near 的差值,就是视景体的深度。视点和视景体的相对位置关系是固定的,视点移动时,视景体也随之移动。假设 view 是视景体,width 和 height 是窗口的宽度和高度,在投影变换之前,需要先声明是对投影矩阵的操作,并将投影矩阵单位化:

glMatrixMode(GL_PROJECTION)   ,含义为选定矩阵为模型-观察变换 矩阵

OpenGL中的变换命令都是对当前矩阵(当前矩阵为以后图形变换所要使用的矩阵)进行操作,因此在选定可修#改矩阵后,应首先用glLoadIdentity()命令设置当前操作矩阵为单位矩阵

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)设置视点

视点是和视景体关联的概念。设置视点需要考虑眼睛在哪儿、看哪儿、头顶朝哪儿,分别对应着eye, lookat 和 eye_up 三个向量.

gluLookAt(	
       #设置相机在世界坐标系中的位置
       eye[0], eye[1], eye[2], 	
       #相机镜头对准的物体在世界坐标系中的位置
       look_at[0], look_at[1], look_at[2],
	   #相机向上的方向在世界坐标系中的方向
       eye_up[0], eye_up[1], eye_up[2]	
   )

(4)设置视口 

视口的大小和尺寸是在窗口坐标系中进行度量的, 默认状 态下其坐标原点位于窗口的左下角,其尺寸与窗口的大小 相同

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

(5)设置模型变换

模型平移、旋转、缩放等几何变换,需要切换到模型矩阵:

glMatrixMode(GL_MODELVIEW)	
glLoadIdentity()
#平移操作函数
glTanslate(x,y,z)
#平移,(x,y,z,1)乘以 N(4x4矩阵)进行矩阵变换
glMultMatrixf(N)
#旋转函数,绕矢量v=(x,y,z)T逆时针方向旋转angle指定的角度。  
glRotate(angle,x,y,z)
#缩放函数	
glScale(1.0, 1.0, 1.0)

同时使用视图变换和模型变换,需要先调用视图变换函数,后调用模型变换函数,以保证模型变换首先对物体起作用。

多种变换组合调用顺序 ,写函数的时候要注意顺序,否则可能不起作用

Python OpenGL基本配置方式

具体代码分析

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文件中数据按行读取出来,存储到列表中,由于边数事先看了为0,所以没遍历边,如果边不为0,记得遍历,并在后文加上边的绘制
    for line in lines:
        m.append(line.split())
    for i in range(len(m)):
        #跳过第一行的OFF
        if m[i][0] == 'OFF':
            continue
        #记录定点数,面片数和边数
        elif i == 1:
            v_cout = int(m[i][0])
            f_count = int(m[i][1])
            e_count = int(m[i][2])
            continue
        #把字符型数据转化为数值型数据
        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文件包含的顶点,面片,边和off文件存储数据信息
    v_cout, f_count, e_count, n = readOFF()
    # 设置渲染背景
    glClearColor(0.0, 0.0, 0.0, 0.0)
    #清除缓存
    glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT)
    # 设置投影(透视投影)
    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)
    #设置观察变换
    #设置视点
    gluLookAt(
        -5, 5, 0,
        0, 0, 0,
        0, 1, 0,
    )
    #设置模型变换
    #平移
    glTranslate(1, 1, 0)
    #旋转
    glRotatef(angle, -5, 5, 0)
    # 缩放
    glScalef(5, 5, 5)
 
    for i in range(f_count):
        #获取顶点个数,和顶点信息
        cout , a, b, c = n[v_cout + i]
        cout, a, b, c=int(cout) ,int(a) ,int(b) ,int(c)
        #得到顶点位置
        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()
 
#关闭窗口
def close(key,x,y):
    if key==b'\x1b':
        glutDestroyWindow(win_id)
 
if __name__ == "__main__":
    angle = 0
    # 初始化glut窗口
    glutInit()
    # 设置窗口显示模式:RGBA四通道|单缓存|深度
    glutInitDisplayMode(GLUT_RGBA | GLUT_SINGLE | GLUT_DEPTH)
    # 初始化窗口大小
    glutInitWindowSize(1000, 800)
    # 创建窗口
    win_id = glutCreateWindow("CUBE")
    # 设置渲染函数
    glutDisplayFunc(draw)
    # 设置窗口空闲时函数
    glutIdleFunc(draw)
    # 开启深度测试
    glEnable(GL_DEPTH_TEST)
    # 开启窗口主循环
    glutMainLoop()

Tags in this post...

Python 相关文章推荐
python根据给定文件返回文件名和扩展名的方法
Mar 27 Python
Python 中 list 的各项操作技巧
Apr 13 Python
Python实现的读写json文件功能示例
Jun 05 Python
利用python对Excel中的特定数据提取并写入新表的方法
Jun 14 Python
python使用ddt过程中遇到的问题及解决方案【推荐】
Oct 29 Python
Numpy之random函数使用学习
Jan 29 Python
python生成器推导式用法简单示例
Oct 08 Python
python通过nmap扫描在线设备并尝试AAA登录(实例代码)
Dec 30 Python
Tensorflow训练模型越来越慢的2种解决方案
Feb 07 Python
Python 在 VSCode 中使用 IPython Kernel 的方法详解
Sep 05 Python
python 如何快速复制序列
Sep 07 Python
解决jupyter notebook启动后没有token的坑
Apr 24 Python
Python面试不修改数组找出重复的数字
May 20 #Python
Python 中面向接口编程
May 20 #Python
人工智能深度学习OpenAI baselines的使用方法
May 20 #Python
baselines示例程序train_cartpole.py的ImportError
May 20 #Python
python通过新建环境安装tfx的问题
May 20 #Python
Python使用BeautifulSoup4修改网页内容
May 20 #Python
python标准库ElementTree处理xml
May 20 #Python
You might like
php格式输出文件var_export函数实例
2014/11/15 PHP
php 使用array函数实现分页
2015/02/13 PHP
如何使用PHP对网站验证码进行破解
2015/09/17 PHP
WordPress中制作导航菜单的PHP核心方法讲解
2015/12/11 PHP
轻轻松松学习JavaScript
2007/02/25 Javascript
jquery 框架使用教程 AJAX篇
2009/10/11 Javascript
javascript学习笔记(十三) js闭包介绍(转)
2012/06/20 Javascript
Javascript正则控制文本框只能输入整数或浮点数
2014/09/02 Javascript
JS控制弹出新页面窗口位置和大小的方法
2015/03/02 Javascript
浅析JavaScript中的事件机制
2015/06/04 Javascript
JS实现CheckBox复选框全选、不选或全不选功能
2020/07/28 Javascript
nodejs获取微信小程序带参数二维码实现代码
2017/04/12 NodeJs
纯javascript前端实现base64图片下载(兼容IE10+)
2018/09/14 Javascript
vue项目中使用scss的方法步骤
2019/05/16 Javascript
laravel实现中文和英语互相切换的例子
2019/09/30 Javascript
[01:01:13]2018DOTA2亚洲邀请赛 4.5 淘汰赛 Mineski vs VG 第三场
2018/04/06 DOTA
Python中转换角度为弧度的radians()方法
2015/05/18 Python
如何准确判断请求是搜索引擎爬虫(蜘蛛)发出的请求
2015/10/13 Python
[原创]pip和pygal的安装实例教程
2017/12/07 Python
Pipenv一键搭建python虚拟环境的方法
2018/05/22 Python
Tensorflow加载预训练模型和保存模型的实例
2018/07/27 Python
Python装饰器用法实例分析
2019/01/14 Python
详解Ubuntu16.04安装Python3.7及其pip3并切换为默认版本
2019/02/25 Python
Pycharm2020.1安装中文语言插件的详细教程(不需要汉化)
2020/08/07 Python
详解Anaconda 的安装教程
2020/09/23 Python
编译 pycaffe时报错:fatal error: numpy/arrayobject.h没有那个文件或目录
2020/11/29 Python
Selenium+BeautifulSoup+json获取Script标签内的json数据
2020/12/07 Python
俄罗斯的精英皮具:Wittchen
2018/01/29 全球购物
澳大利亚最早和最古老的巨型游戏专家:Yardgames
2020/02/20 全球购物
雷朋巴西官方商店:Ray-Ban Brasil
2020/07/21 全球购物
会计电算一体化个人简历的自我评价
2013/10/15 职场文书
资料员岗位职责
2013/11/17 职场文书
五年后的职业生涯规划
2014/03/04 职场文书
优秀大专毕业生求职信
2014/08/04 职场文书
2014年质量管理工作总结
2014/12/01 职场文书
个人自荐书范文
2015/03/09 职场文书