当前位置: 首页 > news >正文

【OpenGL教程2】 简单案例介绍Python 中的 OpenGL

目录

  • 一、介绍
  • 二、安装
  • 三、编码练习
  • 四、结论

一、介绍

   在本教程中,我们将学习如何在 Python 中使用PyOpenGL库。OpenGL是一个图形库,受Windows、Linux和MacOS等多个平台支持,也可用于多种其他语言;然而,这篇文章的范围将仅限于它在 Python 编程语言中的使用。

   与其他类似的图形库相比,OpenGL 相当简单。我们将从在我们的系统上进行设置开始,然后编写一个简单的示例来演示该库的用法。

二、安装

   使用 Python 安装 OpenGL 最简单的方法是通过pip包管理器。如果您的系统中安装了 pip,请运行以下命令来下载并安装 OpenGL:

$ pip install PyOpenGL PyOpenGL_accelerate

   注意,此处是个坑,从这样安装未必成功。建议先安装了,然后出错后尝试进行另一种安装。参见文章:https://yamagota.blog.csdn.net/article/details/136131106

   该命令执行完成后,如果安装成功,您应该在最后得到以下输出:

Successfully installed PyOpenGL-3.1.0 PyOpenGL-accelerate-3.1.0

   现在我们已经在我们的系统上成功安装了 OpenGL,让我们开始动手吧。

三、编码练习

   要在代码中使用 OpenGL,我们需要做的第一件事就是导入它。为此,请运行以下命令:

import OpenGL

   在我们继续之前,当您打算在程序中使用此库时,您需要导入一些其他库。以下是这些导入的代码:

import OpenGL.GL
import OpenGL.GLUT
import OpenGL.GLU
print("Imports successful!") # If you see this printed to the console then installation was successful

   现在我们已经完成了必要的导入,让我们首先创建一个窗口来显示我们的图形。下面给出了代码,以及注释中的解释:

def showScreen():glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT) # Remove everything from screen (i.e. displays all white)glutInit() # Initialize a glut instance which will allow us to customize our window
glutInitDisplayMode(GLUT_RGBA) # Set the display mode to be colored
glutInitWindowSize(500, 500)   # Set the width and height of your window
glutInitWindowPosition(0, 0)   # Set the position at which this windows should appear
wind = glutCreateWindow("OpenGL Coding Practice") # Give your window a title
glutDisplayFunc(showScreen)  # Tell OpenGL to call the showScreen method continuously
glutIdleFunc(showScreen)     # Draw any graphics or shapes in the showScreen function at all times
glutMainLoop()  # Keeps the window created above displaying/running in a loop

   将上面的导入以及此代码复制到单个 python (.py) 文件中,然后执行它。您应该会看到弹出一个白色方形尺寸屏幕。现在,如果我们希望绘制任何形状或制作任何其他类型的图形,我们需要在“showScreen”函数中执行此操作。

   现在让我们尝试使用 OpenGL 制作一个正方形,但在此之前我们需要了解 OpenGL 遵循的坐标系。

   (0,0) 点是窗口的左上角,如果从那里向上,您将沿着 y 轴移动,如果从那里向右移动,您将沿着 x 轴移动。因此,窗口的左上角为 (0, 500),右上角为 (500, 500),右下角为 (500, 0)。

   注意:我们讨论的是上面创建的窗口,在我们的示例中,该窗口的尺寸为 500 x 500,而不是您计算机的全屏。

   现在我们已经解决了这个问题,让我们编写一个正方形。代码的解释可以在评论中找到。

from OpenGL.GL import *
from OpenGL.GLUT import *
from OpenGL.GLU import *w, h = 500,500
# ---Section 1---
def square():# We have to declare the points in this sequence: bottom left, bottom right, top right, top leftglBegin(GL_QUADS) # Begin the sketchglVertex2f(100, 100) # Coordinates for the bottom left pointglVertex2f(200, 100) # Coordinates for the bottom right pointglVertex2f(200, 200) # Coordinates for the top right pointglVertex2f(100, 200) # Coordinates for the top left pointglEnd() # Mark the end of drawing
# This alone isn't enough to draw our square
# ---Section 2---def showScreen():glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT) # Remove everything from screen (i.e. displays all white)glLoadIdentity() # Reset all graphic/shape's positionsquare() # Draw a square using our functionglutSwapBuffers()#---Section 3---glutInit()
glutInitDisplayMode(GLUT_RGBA) # Set the display mode to be colored
glutInitWindowSize(500, 500)   # Set the w and h of your window
glutInitWindowPosition(0, 0)   # Set the position at which this windows should appear
wind = glutCreateWindow("OpenGL Coding Practice") # Set a window title
glutDisplayFunc(showScreen)
glutIdleFunc(showScreen) # Keeps the window open
glutMainLoop()  # Keeps the above created window displaying/running in a loop

   运行上面的代码将绘制一个正方形,但该正方形将不可见,因为它的颜色与窗口的颜色相同,因此我们还需要为其分配不同的颜色,为此我们将进行一些更改上面代码的“第2节”即函数showScreen。glLoadIdentity在语句下方和语句上方添加以下行square():

glColor3f(1.0, 0.0, 3.0) # Set the color to pink

   然而,我们的代码仍然不完整。它当前所做的就是绘制一次正方形,然后再次清除屏幕。我们不希望这样。实际上,我们甚至无法发现它实际绘制正方形的时刻,因为它会在一瞬间出现和消失。让我们编写另一个函数来避免这种情况。

# Add this function before Section 2 of the code above i.e. the showScreen function
def iterate():glViewport(0, 0, 500,500)glMatrixMode(GL_PROJECTION)glLoadIdentity()glOrtho(0.0, 500, 0.0, 500, 0.0, 1.0)glMatrixMode (GL_MODELVIEW)glLoadIdentity() 

   在上面代码的“第 2 节”中调用此迭代函数glColor3dshowScreen。将其添加到函数中语句的下方glLoadIdentity和上方。

glColor3dshowScreen现在让我们将所有这些编译到一个代码文件中,这样就不会出现歧义:

from OpenGL.GL import *
from OpenGL.GLUT import *
from OpenGL.GLU import *w,h= 500,500
def square():glBegin(GL_QUADS)glVertex2f(100, 100)glVertex2f(200, 100)glVertex2f(200, 200)glVertex2f(100, 200)glEnd()def iterate():glViewport(0, 0, 500, 500)glMatrixMode(GL_PROJECTION)glLoadIdentity()glOrtho(0.0, 500, 0.0, 500, 0.0, 1.0)glMatrixMode (GL_MODELVIEW)glLoadIdentity()def showScreen():glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)glLoadIdentity()iterate()glColor3f(1.0, 0.0, 3.0)square()glutSwapBuffers()glutInit()
glutInitDisplayMode(GLUT_RGBA)
glutInitWindowSize(500, 500)
glutInitWindowPosition(0, 0)
wind = glutCreateWindow("OpenGL Coding Practice")
glutDisplayFunc(showScreen)
glutIdleFunc(showScreen)
glutMainLoop()

当您运行此命令时,应该会出现一个窗口,其中有一个粉红色的方框。

输出:
在这里插入图片描述

四、结论

   在本教程中,我们了解了 OpenGL、如何下载和安装它,然后将其用作一个简短的示例程序。在此示例中,我们还练习了使用 OpenGL 制作基本形状,这使我们深入了解了每当需要使用此库绘制某些内容时需要进行的一些复杂函数调用。总而言之,OpenGL 非常丰富,并且随着我们深入研究它,发现它会变得越来越复杂。

相关文章:

【OpenGL教程2】 简单案例介绍Python 中的 OpenGL

目录 一、介绍二、安装三、编码练习四、结论 一、介绍 在本教程中,我们将学习如何在 Python 中使用PyOpenGL库。OpenGL是一个图形库,受Windows、Linux和MacOS等多个平台支持,也可用于多种其他语言;然而,这篇文章的范围…...

评估方法:CMMI/能力成熟度模型集成

一、什么是CMMI CMMI,全称为Capability Maturity Model Integration,即能力成熟度模型集成。它是由美国卡内基梅隆大学软件工程研究所研发的过程改进模型,也是国际上用于评价软件企业能力成熟度的一项重要标准。 CMMI的目的是帮助软件企业对…...

Gin框架: HTML模板渲染之配置与语法详解

Gin的HTML模板配置 1 &#xff09;单一目录的配置 配置模板目录&#xff0c;在与main.go同级下, 新建目录&#xff0c;下面二选一&#xff0c;仅作举例, 这里选择 tpls templatestpls 在 tpls 目录下新建 news.html <!-- 最简单的 --> <h1>News Page</h1>&l…...

.NET Core WebAPI中使用Log4net 日志级别分类并记录到数据库

一、效果 记录日志为文档 记录日志到数据库 二、添加NuGet包 三、log4net.config代码配置 <?xml version"1.0" encoding"utf-8" ?> <log4net><!-- Debug日志 --><appender name"RollingFileDebug" type"log4net…...

Day36 贪心算法 part05

划分字母区间 一个字母区间仅有几个字母前一个字母区间有的字母后面都没有 合并区间 天才举一反三写出来了...

C#计算矩形面积:通过定义结构 vs 通过继承类

目录 一、涉及到的知识点 1.结构 2.结构和类的区别 3.继承 4.使用类继承提高程序的开发效率 5.属性 &#xff08;1&#xff09;属性定义 &#xff08;2&#xff09;get访问器 &#xff08;3&#xff09;set访问器 6. 属性和字段的区别 二、实例&#xff1a;通过定义…...

【复现】Panalog大数据日志审计系统 RCE漏洞_51

目录 一.概述 二 .漏洞影响 三.漏洞复现 1. 漏洞一&#xff1a; 四.修复建议&#xff1a; 五. 搜索语法&#xff1a; 六.免责声明 一.概述 Panalog大数据日志审计系统定位于将大数据产品应用于高校、 公安、 政企、 医疗、 金融、 能源等行业之中&#xff0c;针对网络流…...

react【五】redux/reduxToolkit/手写connext

文章目录 1、回顾纯函数2、redux2.1 redux的基本使用2.2 通过action修改store的数值2.3 订阅state的变化2.4 目录结构2.5 Redux的使用过程2.6 redux的三大原则2.7 Redux官方图 3、redux在React中的使用4、react-redux使用4.1 react-redux的基本使用4.2 异步请求 redux-thunk4.3…...

.NET开源的一个小而快并且功能强大的 Windows 动态桌面软件 - DreamScene2

前言 很多同学都不愿给电脑设动态壁纸&#xff0c;其中有个重要原因就是嫌它占资源过多。今天大姚分享一个.NET开源、免费&#xff08;MIT license&#xff09;的一个小而快并且功能强大的 Windows 动态桌面软件&#xff0c;支持视频和网页动画播放&#xff1a;DreamScene2。 …...

jsp计算机线上教学系统Myeclipse开发mysql数据库web结构java编程计算机网页项目

一、源码特点 JSP 计算机线上教学系统是一套完善的java web信息管理系统&#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。开发环境为 TOMCAT7.0,Myeclipse8.5开发&#xff0c;数据库为Mysql5…...

RabbitMQ的高可用机制

RabbitMQ通过多种机制提供高可用性(HA)支持&#xff0c;以确保消息系统的稳定性和可靠性。下面将详细介绍这些机制&#xff0c;并提供代码示例。 集群&#xff08;Clustering&#xff09; RabbitMQ的集群提供了高可用性和负载均衡。集群中的节点共享同一个Erlang分布式数据库…...

人机协同中的贝叶斯和马尔可夫

人机协同中的马尔可夫链是指在人与机器之间协同工作过程中&#xff0c;可能涉及到的状态转移概率模型。马尔可夫链是一种数学模型&#xff0c;描述了在给定当前状态下&#xff0c;未来状态的概率分布只依赖于当前状态&#xff0c;而与过去状态无关的随机过程。在人机协同工作中…...

STM32的SDIO

一.SDIO简介 SDIO&#xff0c;全称Secure Digital Input/Output&#xff0c;是一种用于在移动设备和嵌入式系统中实现输入/输出功能的接口标准。它结合了SD卡的存储功能和I/O功能&#xff0c;允许设备通过SD卡槽进行数据输入输出和外围设备连接。 SDIO接口通常被用于连接各种…...

Unity中的Lerp插值的使用

Unity中的Lerp插值使用 前言Lerp是什么如何使用Lerp 前言 平时在做项目中插值的使用避免不了&#xff0c;之前一直在插值中使用存在误区&#xff0c;在这里浅浅记录一下。之前看的博客或者教程还多都存在一个“永远到达不了&#xff0c;只能无限接近”的一个概念。可能是之前脑…...

年后上来面了一个来字节要求月薪23K,明显感觉他背了很多面试题...

最近有朋友去字节面试&#xff0c;面试前后进行了20天左右&#xff0c;包含4轮电话面试、1轮笔试、1轮主管视频面试、1轮hr视频面试。 据他所说&#xff0c;80%的人都会栽在第一轮面试&#xff0c;要不是他面试前做足准备&#xff0c;估计都坚持不完后面几轮面试。 其实&…...

代码随想录算法训练营DAY20 | 二叉树 (8)

一、LeetCode 701 二叉搜索树中的插入操作 题目链接&#xff1a; 701.二叉搜索树中的插入操作https://leetcode.cn/problems/insert-into-a-binary-search-tree/description/ 思路&#xff1a;见缝插针罢辽。 class Solution {public TreeNode insertIntoBST(TreeNode root, i…...

2023年全球软件开发大会(QCon北京站2023)2月:核心内容与学习收获(附大会核心PPT下载)

本次峰会是一个汇集了最新技术趋势、最佳实践和创新思维的盛会。对于从事软件开发和相关领域的专业人士来说&#xff0c;参加这样的大会将有助于他们了解行业动态、提升技能水平、拓展职业视野&#xff0c;并与同行建立联系和合作。 本次峰会包含&#xff1a;AI基础架构、DevO…...

键盘输入4个数,从小到大排序

题目 键盘输入4个整数&#xff0c;从小到大排序 思路 代码 #define _CRT_SECURE_NO_WARNINGS 1 #include<stdio.h>//键盘输入4个整数&#xff0c;从小到大排序 int main() {int n1, n2, n3, n4;scanf_s("%d %d %d %d", &n1, &n2, &n3, &n4);…...

Day11-Linux系统iNode及链接知识及企业按哪里精讲

Day11-Linux系统iNode及链接知识及企业按哪里精讲 1. 文件核心 属性知识1.1 什么是索引节点&#xff08;inode&#xff09;。1.2 索引节点作用1.3 inode是怎么产生的&#xff1f;1.4 inode的特点&#xff1f;1.5 Linux系统读取文件的原理1.6 企业生产案例&#xff1a;No space …...

C# Thread的使用

在C#中&#xff0c;线程用于实现程序的并发执行。通过创建和管理多个线程&#xff0c;可以同时处理不同的任务或操作&#xff0c;从而提高程序性能和响应性。以下是如何在C#中使用线程的基本步骤&#xff1a; 创建新线程 // 使用System.Threading命名空间 using System.Threa…...

Chapter03-Authentication vulnerabilities

文章目录 1. 身份验证简介1.1 What is authentication1.2 difference between authentication and authorization1.3 身份验证机制失效的原因1.4 身份验证机制失效的影响 2. 基于登录功能的漏洞2.1 密码爆破2.2 用户名枚举2.3 有缺陷的暴力破解防护2.3.1 如果用户登录尝试失败次…...

零门槛NAS搭建:WinNAS如何让普通电脑秒变私有云?

一、核心优势&#xff1a;专为Windows用户设计的极简NAS WinNAS由深圳耘想存储科技开发&#xff0c;是一款收费低廉但功能全面的Windows NAS工具&#xff0c;主打“无学习成本部署” 。与其他NAS软件相比&#xff0c;其优势在于&#xff1a; 无需硬件改造&#xff1a;将任意W…...

Qt/C++开发监控GB28181系统/取流协议/同时支持udp/tcp被动/tcp主动

一、前言说明 在2011版本的gb28181协议中&#xff0c;拉取视频流只要求udp方式&#xff0c;从2016开始要求新增支持tcp被动和tcp主动两种方式&#xff0c;udp理论上会丢包的&#xff0c;所以实际使用过程可能会出现画面花屏的情况&#xff0c;而tcp肯定不丢包&#xff0c;起码…...

React Native 导航系统实战(React Navigation)

导航系统实战&#xff08;React Navigation&#xff09; React Navigation 是 React Native 应用中最常用的导航库之一&#xff0c;它提供了多种导航模式&#xff0c;如堆栈导航&#xff08;Stack Navigator&#xff09;、标签导航&#xff08;Tab Navigator&#xff09;和抽屉…...

DIY|Mac 搭建 ESP-IDF 开发环境及编译小智 AI

前一阵子在百度 AI 开发者大会上&#xff0c;看到基于小智 AI DIY 玩具的演示&#xff0c;感觉有点意思&#xff0c;想着自己也来试试。 如果只是想烧录现成的固件&#xff0c;乐鑫官方除了提供了 Windows 版本的 Flash 下载工具 之外&#xff0c;还提供了基于网页版的 ESP LA…...

css的定位(position)详解:相对定位 绝对定位 固定定位

在 CSS 中&#xff0c;元素的定位通过 position 属性控制&#xff0c;共有 5 种定位模式&#xff1a;static&#xff08;静态定位&#xff09;、relative&#xff08;相对定位&#xff09;、absolute&#xff08;绝对定位&#xff09;、fixed&#xff08;固定定位&#xff09;和…...

LLM基础1_语言模型如何处理文本

基于GitHub项目&#xff1a;https://github.com/datawhalechina/llms-from-scratch-cn 工具介绍 tiktoken&#xff1a;OpenAI开发的专业"分词器" torch&#xff1a;Facebook开发的强力计算引擎&#xff0c;相当于超级计算器 理解词嵌入&#xff1a;给词语画"…...

算法:模拟

1.替换所有的问号 1576. 替换所有的问号 - 力扣&#xff08;LeetCode&#xff09; ​遍历字符串​&#xff1a;通过外层循环逐一检查每个字符。​遇到 ? 时处理​&#xff1a; 内层循环遍历小写字母&#xff08;a 到 z&#xff09;。对每个字母检查是否满足&#xff1a; ​与…...

C语言中提供的第三方库之哈希表实现

一. 简介 前面一篇文章简单学习了C语言中第三方库&#xff08;uthash库&#xff09;提供对哈希表的操作&#xff0c;文章如下&#xff1a; C语言中提供的第三方库uthash常用接口-CSDN博客 本文简单学习一下第三方库 uthash库对哈希表的操作。 二. uthash库哈希表操作示例 u…...

WebRTC从入门到实践 - 零基础教程

WebRTC从入门到实践 - 零基础教程 目录 WebRTC简介 基础概念 工作原理 开发环境搭建 基础实践 三个实战案例 常见问题解答 1. WebRTC简介 1.1 什么是WebRTC&#xff1f; WebRTC&#xff08;Web Real-Time Communication&#xff09;是一个支持网页浏览器进行实时语音…...