某一天,我突然喜欢上了3D,在一些scratch教程中见过一些3D引擎,找了一个简单的,结果z轴太大了,于是网上一搜,就发现了pyglet

还是先讲如何启动一个窗口

先看看官网:

Creating a window
If the Window constructor is called with no arguments, defaults will be assumed for all parameters: window = pyglet.window.Window()
The default parameters used are: The window will have a size of 640x480, and not be resizable.
A default context will be created using template config described in OpenGL configuration options.
The window caption will be the name of the executing Python script (i.e., sys.argv[0]).
Windows are visible as soon as they are created, unless you give the visible=False argument to the constructor. The following example shows how to create and display a window in two steps: window = pyglet.window.Window(visible=False)
# ... perform some additional initialisation
window.set_visible()
Context configuration
The context of a window cannot be changed once created. There are several ways to control the context that is created: Supply an already-created Context using the context argument: context = config.create_context(share)
window = pyglet.window.Window(context=context)
Supply a complete Config obtained from a Screen using the config argument. The context will be created from this config and will share object space with the most recently created existing context: config = screen.get_best_config(template)
window = pyglet.window.Window(config=config)
Supply a template Config using the config argument. The context will use the best config obtained from the default screen of the default display: config = gl.Config(double_buffer=True)
window = pyglet.window.Window(config=config)
Specify a Screen using the screen argument. The context will use a config created from default template configuration and this screen: screen = display.get_screens()[screen_number]
window = pyglet.window.Window(screen=screen)
Specify a Display using the display argument. The default screen on this display will be used to obtain a context using the default template configuration: display = platform.get_display(display_name)
window = pyglet.window.Window(display=display)
If a template Config is given, a Screen or Display may also be specified; however any other combination of parameters overconstrains the configuration and some parameters will be ignored.

总结了就是

import pyglet as p
p.window.Window(600,600)
p.app.run()

效果:

然后画个正方形

import pyglet as p
from pyglet.gl import *
win=p.window.Window(600,600)
@win.event
def on_draw():
#(
win.clear()
glMatrixMode(GL_PROJECTION)
glLoadIdentity()
gluPerspective(90, 1, 0.1, 100)
glMatrixMode(GL_MODELVIEW)
glLoadIdentity()
#)
pos=[0,0,-20]
glTranslatef(*pos)
glBegin(GL_POLYGON)
glVertex3f(-5,-5,0)
glVertex3f(5,-5,0)
glVertex3f(5,5,0)
glVertex3f(-5,5,0)
glEnd() glFlush()
p.app.run()

#(  和  #)中间的是固定的,不能改

glTranslatef(*pos):摄像头位置
glBegin(GL_POLYGON):开始绘制多边形

    glVertex3f(-5,-5,0)
glVertex3f(5,-5,0)
glVertex3f(5,5,0)
glVertex3f(-5,5,0):给出所有坐标点,绘制图形
glEnd():结束绘制当前图形
glFlush():刷新界面

都包含在pyglet.gl里,可使用
from pyglet.gl import *

 效果:

这就是本篇文章的内容

最后留个彩蛋

import pyglet
from pyglet.gl import * pos = [0, 0, -20]
rot_y = 0
rot_x=0
rot_z=0
config = Config(sample_buffers=1, samples=8)
tela = pyglet.window.Window(height=500, width=500, #config=config)
)
mode=True
dotlst=[[[-5,-5,0],[5,-5,0],[5,5,0],[-5,5,0]]]
input_=""
@tela.event
def on_draw(): global pos_z, rot_y,rot_z,rot_X tela.clear() glMatrixMode(GL_PROJECTION)
glLoadIdentity()
gluPerspective(90, 1, 0.1, 100)
glMatrixMode(GL_MODELVIEW)
glLoadIdentity() glTranslatef(*pos)
glRotatef(rot_y, 0, 1, 0)
glRotatef(rot_z,0,0,1)
glRotatef(rot_x,1,0,0)
glBegin(GL_POLYGON)
glVertex3f(-5,-5,0)
glVertex3f(5,-5,0)
glVertex3f(5,5,0)
glVertex3f(-5,5,0)
glEnd() glFlush() @tela.event
def on_key_press(s,m): global pos_z, rot_y,rot_z,rot_x
if s == pyglet.window.key.W:
pos[2] -= 1
if s == pyglet.window.key.S:
pos[2] += 1
if s == pyglet.window.key.A:
pos[0]-=1
if s == pyglet.window.key.D:
pos[0] += 1
if s == pyglet.window.key.R:
pos[1]-=1
if s == pyglet.window.key.F:
pos[1] += 1
if s == pyglet.window.key.I:
rot_z -= 5
if s == pyglet.window.key.K:
rot_z += 5
if s == pyglet.window.key.J:
rot_x-=5
if s == pyglet.window.key.L:
rot_x+= 5
if s == pyglet.window.key.O:
rot_y-=5
if s == pyglet.window.key.P:
rot_y += 5 pyglet.app.run()

  

WSADRFJKLIOP操作

原理下次讲

后面的出了会写在最下面的。

下一讲

Python:pyglet学习(1):想弄点3D,还发现了pyglet的更多相关文章

  1. 开始写下自己的python的cocos2d, pyglet学习

    开始写下自己的python的cocos2d, pyglet学习 2014年01月18日 13:52:36 我要做程序达人 阅读数 9051更多 分类专栏: python的cocos2d和pyglet ...

  2. caffe的python接口学习(4):mnist实例---手写数字识别

    深度学习的第一个实例一般都是mnist,只要这个例子完全弄懂了,其它的就是举一反三的事了.由于篇幅原因,本文不具体介绍配置文件里面每个参数的具体函义,如果想弄明白的,请参看我以前的博文: 数据层及参数 ...

  3. Python Tutorial 学习(八)--Errors and Exceptions

    Python Tutorial 学习(八)--Errors and Exceptions恢复 Errors and Exceptions 错误与异常 此前,我们还没有开始着眼于错误信息.不过如果你是一 ...

  4. Day1 Python基础学习

    一.编程语言分类 1.简介 机器语言:站在计算机的角度,说计算机能听懂的语言,那就是直接用二进制编程,直接操作硬件 汇编语言:站在计算机的角度,简写的英文标识符取代二进制去编写程序,本质仍然是直接操作 ...

  5. Day1 Python基础学习——概述、基本数据类型、流程控制

    一.Python基础学习 一.编程语言分类 1.简介 机器语言:站在计算机的角度,说计算机能听懂的语言,那就是直接用二进制编程,直接操作硬件 汇编语言:站在计算机的角度,简写的英文标识符取代二进制去编 ...

  6. python爬虫学习(1) —— 从urllib说起

    0. 前言 如果你从来没有接触过爬虫,刚开始的时候可能会有些许吃力 因为我不会从头到尾把所有知识点都说一遍,很多文章主要是记录我自己写的一些爬虫 所以建议先学习一下cuiqingcai大神的 Pyth ...

  7. Python正则表达式学习摘要及资料

    摘要 在正则表达式中,如果直接给出字符,就是精确匹配. {m,n}? 对于前一个字符重复 m 到 n 次,并且取尽可能少的情况 在字符串'aaaaaa'中,a{2,4} 会匹配 4 个 a,但 a{2 ...

  8. webdriver(python)学习笔记一

    最近有python开发的项目,也正打算要学习自动化与python语言.因此想通过学习python版本的webdriver来一同学习. 学习过程中参考资料有乙醇的博客:https://github.co ...

  9. !!对python列表学习整理列表及数组详细介绍

    1.Python的数组分三种类型:(详细见 http://blog.sina.com.cn/s/blog_6b783cbd0100q2ba.html) (1) list 普通的链表,初始化后可以通过特 ...

随机推荐

  1. webpack搭建react+ts+eslint项目

    [初始化项目] mkdir react_ts_eslint cd react_ts_eslint npm init [生成ts配置文件] tsc --init [安装相关依赖] npm install ...

  2. UIScrollView的代理方法(delegate)

    // ViewController.m // 05-UIScrollView的代理(delegate) #import "ViewController.h" @interface ...

  3. java中Statement 对象

    1.创建Statement对象建立了到特定数据库的连接之后,就可用该连接发送 SQL 语句.Statement 对象用 Connection 的方法 createStatement 创建,如下列代码段 ...

  4. byte溢出栗子

    原创:转载需注明原创地址 https://www.cnblogs.com/fanerwei222/p/11634402.html byte溢出测试: byte b1 = (byte) 127; byt ...

  5. MySQL 数据库SQL语句——高阶版本1

    MySQL 数据库SQL语句--高阶版本 实验准备,数据表配置 mysql -uroot -p show databases; create database train_ticket; use tr ...

  6. day2 -- 字符串常用方法、列表、字典

    1.字符串常用方法 name = "Convict abc" count(): print(name.count("c")) # 2 find(): print ...

  7. 了解selenium这个工具

    selenium 也不是简单一个工具,而是由几个工具组成,每个工具都有其特点和应用场景.   selenium IDE selenium IDE 是嵌入到Firefox浏览器中的一个插件,实现简单的浏 ...

  8. 记录使用WKWebView进行OC与JS交互所踩过的坑

    目录: 1.页面cookie缓存 2.允许弹出JS的弹框 3.在webview页面加载的时候,添加加载进度条 4.禁止掉webview页面的长按复制粘贴功能 5.设置webview的userAgent ...

  9. 基于ASP.NET Core 5.0使用RabbitMQ消息队列实现事件总线(EventBus)

    文章阅读请前先参考看一下 https://www.cnblogs.com/hudean/p/13858285.html 安装RabbitMQ消息队列软件与了解C#中如何使用RabbitMQ 和 htt ...

  10. Oracle 11G 安装详解

    oracle官网下载地址:http://www.oracle.com/technetwork/database/enterprise-edition/downloads/index.html 官网下载 ...