首页 > 编程语言 >Python Pyglet 3D模块(1)

Python Pyglet 3D模块(1)

时间:2024-12-27 22:26:59浏览次数:8  
标签:pyglet 10 函数 glVertex3f Python Pyglet cam GL 3D

一.Pyglet库介绍、安装以及导入

大家好啊,今天我们就来到一起新的课程,在这次课程里,我们需要用python的第三方模块pyglet模块制作各种3D场景,以及到最后的Minecraft。

首先是安装pyglet库,这里如果有conda或anaconda直接用conda或anaconda窗口去安装即可:

conda install pyglet==1.2.4

注意我这里填1.2.4是因为我的python版本只适配1.2.4版本的pyglet 。如果不像我这样有conda或anaconda,就可以使用cmd或python终端安装。

cmd安装:

cd 你的python目录下的Lib/site-packages文件夹
pip install pyglet==你的python适配的pyglet版本

python终端安装:

pip install pyglet==你的python适配的pyglet版本

其次,我们需要导入这个模块,再导入的时候需要注意,有的模块的模块名比较长所以我们在导入这些模块的时候会使用from ... import ...的方法去导入:

import pyglet
from pyglet.gl import * 
from pyglet.gl.glu import *
from pyglet.window import key 

这里的gl模块和glu模块是我们创建3D对象的基础,window模块则是用来创建窗口、对窗口进行操作以及检测按键等。

创建pyglet窗口:

WIDTH=800
HEIGHT=600
window=pyglet.window.Window(WIDTH,HEIGHT)

 然后,如果想要运行,就必须要用到pyglet.app模块了:

pyglet.app.run()

二.Pyglet函数介绍

1.glMatrixMode函数

这个函数是用来设置当前矩阵的类型的,这个函数有一个mode参数,分为两种:1.GL_MODELVIEW(模型视图矩阵)

2.GL_PROJECTION (投影矩阵)

glMatrixMode函数格式:

glMatrixMode(mode)

2.glLoadIdentity函数

这个函数将当前矩阵重置为单位矩阵,用于将当前矩阵设置为初始状态。

glLoadIdentity函数格式:

glLoadIdentity()

3.glFrustum函数

这个函数定义一个透视投影矩阵,指定了视景体(能看到的地方)的六个裁剪面。

left:最左边

right:最右边

bottom:最下边

top:最上边

near:最近

far:最远

glFrustum函数格式:

glFrustum(left,right,bottom,top,near,far)

4.gluPerspective函数

这个函数用于设置透视投影矩阵,指定了视场的垂直视角、宽高比、近裁剪面和远裁剪面。

gluPerspective函数格式:

gluPerspective(fovy,aspect,zNear,zFar)

5.glViewport函数

这个函数用于设置视口,定义窗口中用于绘制的区域。

glViewport函数格式:

glViewport(x,y,width,height)

7.glClear函数

这个函数用于清空指定的缓冲区,可以清空颜色缓冲区、深度缓冲区、模板缓冲区等。

mask:指定缓冲区

glClear函数格式:

glClear(mask)

8.gluLookAt函数

这个函数是一个很重要的函数,我们需要利用这个函数来制作可以控制的3D相机。这个函数用于定义一个观察矩阵,指定相机的位置、观察点的位置和相机的朝向。

gluLookAt函数格式:

gluLookAt(eyeX,eyeY,eyeZ,centerX,centerY,centerZ,upX,upY,upZ)

9.glFlush函数

这个函数就像是python pygame模块中的flip函数和update函数,用于强制将缓冲区中的绘制命令立即执行,也就是将缓冲区的图像绘制到屏幕上。

glFlush函数格式:

glFlush()

10.glVertex3f函数

指定点、线段和多边形的顶点。3个参数分别是x, y, z坐标。通过反复调用这个函数, 就可以绘制出任何几何图形。

glVertex3f函数格式:

glVertex3f(x,y,z)

11.glBegin函数和glEnd函数

这两个函数用于指定多边形、线段的开始和结束。开始时调用glBegin函数,结束时调用glEnd函数。

glBegin函数格式:

glBegin(mode)

glEnd函数格式:

glEnd()

mode参数的值有:GL_POINTS,GL_LINES,GL_LINE_LOOPGL_TRIANGLESGL_QUADS和GL_POLYGON等。这里的GL_POLYGON用于绘制正方体的各个面。

12.glColor3f函数和glColor4f函数

glColor3f函数可以设置图形颜色,其中r、g、b的值为0-1。glColor4f函数多了一个alpha参数,用于指定图形的透明度范围为0-1。

glColor3f函数格式:

glColor3f(r,g,b)

glColor4f函数格式:

glColor4f(r,g,b,alpha)

注意在使用glColor4f函数的时候需要调用glEnable函数和glBlendFunc函数:

glEnable(GL_BLEND)
glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA)

13.抗锯齿

在创建窗口的时候将代码改成如下即可:

conf = pyglet.gl.Config(sample_buffers=1, samples=4, depth_size=1)
window = pyglet.window.Window(height=HEIGHT, width=WIDTH,config=conf)

14.on_draw函数和@window.event

上面有关绘制的程序都必须放在on_draw函数里面,注意函数名必须是on_draw,否则无法绑定。在定义on_draw函数前面需要加一个@window.event,否则会什么都显示不出来。

on_draw函数格式:

def on_draw():

        pass

三.示例代码

绘制彩色长方体。

代码:

import pyglet
from pyglet.gl import *
from pyglet.gl.glu import *
from pyglet.window import key

WIDTH=400;HEIGHT=400
cam_x=0;cam_y=0;cam_z=-5
conf = pyglet.gl.Config(sample_buffers=1, samples=4,depth_size=1)
window = pyglet.window.Window(height=HEIGHT, width=WIDTH,
                              config=conf)

@window.event
def on_draw():
    glMatrixMode(GL_PROJECTION)  
    glLoadIdentity()

    glFrustum(-5, 5, -5, 5, 2, 1000)

    glMatrixMode(GL_MODELVIEW)  
    glLoadIdentity()

    glViewport(0, 0, WIDTH,HEIGHT)

    window.clear()
    glClear(GL_DEPTH_BUFFER_BIT) 
 

    gluLookAt(cam_x,cam_y,cam_z,cam_x,cam_y,100000,0,1,0)
    glColor4f(0.5, 0.5, 1, 0.5)
    glBegin(GL_POLYGON)
    glVertex3f(10,10,10)
    glVertex3f(0,10,10)
    glVertex3f(0,0,10)
    glVertex3f(10,0,10)
    glEnd()

    glColor4f(0.5, 1, 0, 0.5)
    glBegin(GL_POLYGON)
    glVertex3f(10, 10, 0)
    glVertex3f(0, 10, 0)
    glVertex3f(0, 0, 0)
    glVertex3f(10, 0, 0)
    glEnd()

    glColor4f(1, 0.5, 1, 0.5)
    glBegin(GL_POLYGON)
    glVertex3f(10, 0, 10)
    glVertex3f(0, 0, 10)
    glVertex3f(0, 0, 0)
    glVertex3f(10, 0, 0)
    glEnd()

    glColor4f(0.5, 1, 1, 0.5)
    glBegin(GL_POLYGON)
    glVertex3f(10, 10, 10)
    glVertex3f(0, 10, 10)
    glVertex3f(0, 10, 0)
    glVertex3f(10, 10, 0)
    glEnd()

    glColor4f(0.8, 0.5, 1, 0.5)
    glBegin(GL_POLYGON)
    glVertex3f(10, 10, 10)
    glVertex3f(10, 10, 0)
    glVertex3f(10, 0, 0)
    glVertex3f(10, 0, 10)
    glEnd()

    glColor4f(1, 0.5, 0.5, 0.5)
    glBegin(GL_POLYGON)
    glVertex3f(0, 10, 10)
    glVertex3f(0, 10, 0)
    glVertex3f(0, 0, 0)
    glVertex3f(0, 0, 10)
    glEnd()

    glFlush()

@window.event
def on_key_press(k,m): 
    global cam_x,cam_y,cam_z
    if k==key.DOWN:
        cam_y-=1
    elif k==key.UP:
        cam_y+=1
    elif k==key.LEFT: 
        cam_x-=1
    elif k==key.RIGHT: 
        cam_x+=1
    on_draw()

glClearColor(1, 1, 1, 1)
glEnable(GL_DEPTH_TEST) 
glEnable(GL_BLEND) 
glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA)
pyglet.app.run()

今天的课程就结束了,大家再见!

标签:pyglet,10,函数,glVertex3f,Python,Pyglet,cam,GL,3D
From: https://blog.csdn.net/qq_42716068/article/details/144777257

相关文章

  • 【CSS in Depth 2 精译_097】第 17 章:CSS 动画特效概述 + 17.1:关键帧的概念及用法 + 1
    当前内容所在位置(可进入专栏查看其他译好的章节内容)第五部分添加动效✔️【第17章动画】✔️17.1关键帧✔️17.23D变换下的动画设置✔️17.2.1添加动画前页面布局的构建✔️17.2.2为布局添加动画✔️17.3动画延迟与填充模式文章目录17动画Animat......
  • 【python因果库实战11】用现有数据运行估计器
    这里写目录标题使用现有数据运行模拟器初始化数据格式化数据用于训练和保存使用现有数据运行模拟器考虑输入数据已经存在并且已有因果结构的情况。我们希望根据这些数据模拟治疗分配和结果。初始化数据首先我们将所需数据加载到pandasDataFrame中:importpand......
  • python爱心代码大全
    python爱心代码 详细分析这段代码实现了一个用Python的Tkinter库绘制跳动爱心的程序,其中包括了一个弹窗来询问是否做一个人的女朋友,如果同意则会显示跳动的爱心,如果拒绝则会重新询问。(无法解决,只能同意哦~)下面对代码进行详细分析:1.导入必要的库首先,导入了一些必要的Python库......
  • Python中的Transformer架构:从BERT到GPT
    文章目录一、Transformer架构基础1.1Transformer的主要组成编码器解码器1.2注意力机制详解二、BERT模型:从预训练到微调2.1BERT的核心创新2.2BERT的实现2.3BERT的应用三、GPT模型:生成式的突破3.1GPT的特点3.2GPT的实现3.3GPT的演进四、BERT与GPT的对比五、如......
  • 用Python优化生成式AI模型的损失函数
    文章目录一、生成式AI中损失函数的基础1.1什么是损失函数?1.2生成式AI中的损失函数类型二、常见损失函数的优化方法2.1重建损失的优化原理优化方法实践代码2.2对抗损失的优化原理优化方法实践代码2.3KL散度与交叉熵的优化原理优化方法实践代码2.4感知损失的优化......
  • COM6503: 3D Computer Graphics:
     COM6503:3DComputerGraphics:Assignment1(40%)DrSteveMaddockDeadline:3pm,Wednesday11DecemberIntroductionTheassignmentwillinvolveusingmodernOpenGLtorenderascene.Scenegraphsarerequiredinthemodellingprocessandanimationcon......
  • WxPython跨平台开发框架之复杂界面内容的分拆和重组处理
    复杂界面内容的分拆和重组处理是现代软件开发中常见的做法,尤其在开发大型应用程序时,可以大幅提升开发效率、可维护性和用户体验。通过将复杂的界面内容分拆成更小的模块,每个模块都专注于单一功能或组件,代码更容易理解和维护。模块化的界面组件可以在多个地方复用,减少了重复开发的......
  • Python硬解码并AI推理——PyNvVideoCodec使用记录
    PyNvVideoCodec替换VPF原来的VPF不能用了,现在变成了了PyNvVideoCodec。直接通过pip安装但是Python版本要大于3.10,但也比之前安装友多了。GitHub-NVIDIA/VideoProcessingFramework:SetofPythonbindingstoC++librarieswhichprovidesfullHWaccelerationforvideo......
  • 【华为OD-E卷 - 猜字谜100分(python、java、c++、js、c)】
    【华为OD-E卷-猜字谜100分(python、java、c++、js、c)】题目小王设计了一个简单的猜字谜游戏,游戏的谜面是一个错误的单词,比如nesw,玩家需要猜出谜底库中正确的单词。猜中的要求如下:对于某个谜面和谜底单词,满足下面任一条件都表示猜中:变换顺序以后一样的,比如通过变换w和e......
  • 郴州年夜饭大数据分析:Python爬虫的美味之旅
    在春节这个阖家团圆的日子里,年夜饭无疑是最具仪式感的一餐。郴州,这座美食之城,其年夜饭的餐桌上自然少不了那些让人垂涎三尺的地道美食。作为一名热爱美食的程序员,我决定用Python爬虫技术,为大家揭秘郴州年夜饭的必备菜品。以下是我如何通过Python爬虫获取郴州年夜饭菜品信息,......