一.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_LOOP,GL_TRIANGLES,GL_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