pyglet and opengl -- 纹理映射以及动画

  1 #-*- coding:gbk -*-
  2 #from pyglet.gl import *
  3 from OpenGL.GL import *
  4 import pyglet
  5 from pyglet import clock
  6 from PIL import Image
  7 from ctypes import *
  8
  9 def draw_rect(x, y,z,width, height,ang):
 10     """
 11     实际矩形代码
 12     """
 13     glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)
 14     glPushMatrix()
 15     glLoadIdentity()
 16     glTranslatef(x+width/2,y+height/2,0.0)
 17     glRotatef(ang,0.0,1.0,0.0)
 18     glBegin(GL_QUADS)
 19     glTexCoord2f(0.0,0.0)  #纹理坐标
 20     glVertex3f(x-width/2, y-height/2,z)
 21     glTexCoord2f(1.0,0.0)
 22     glVertex3f(x + width/2, y-height/2,z)
 23     glTexCoord2f(1.0,1.0)
 24     glVertex3f(x + width/2, y + height/2,z)
 25     glTexCoord2f(0.0,1.0)
 26     glVertex3f(x-width/2, y + height/2,z)
 27     glEnd()
 28     glPopMatrix()
 29
 30
 31 class Button():
 32     x=y=z=0
 33     width=height=10.0
 34     ang=0
 35     TEXTUREWIDTH=100
 36     TEXTUREHEIGHT=100
 37     image_data=[] #保存纹理数据
 38     def draw(self):
 39         """
 40         画矩形
 41         """
 42         draw_rect(self.x,self.y,self.z,self.width,self.height,self.ang)
 43
 44     def loadTexture(self):
 45         """
 46         载入纹理
 47         """
 48         #创建纹理对象
 49         texid=glGenTextures(1)        #绑定纹理
 50         glBindTexture(GL_TEXTURE_2D,texid)
 51         glPixelStorei(GL_UNPACK_ALIGNMENT,1)
 52         #开启纹理功能
 53         glEnable(GL_TEXTURE_2D)
 54         #说明映射方式
 55         glTexEnvf(GL_TEXTURE_ENV,GL_TEXTURE_ENV_MODE,GL_DECAL)
 56         #设置滤波方式
 57         glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_NEAREST)
 58         glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_NEAREST)
 59         #纹理图
 60         glTexImage2D(GL_TEXTURE_2D,0,3,self.TEXTUREWIDTH,self.TEXTUREHEIGHT,0,GL_RGBA,GL_UNSIGNED_BYTE,self.image_data)
 61
 62
 63     def load_image(self,imagePath):
 64         """
 65         读取图像的数据
 66         """
 67         imageData=Image.open(imagePath)
 68         try:
 69             imageData=imageData.convert(‘RGB‘)
 70             self.TEXTUREWIDTH,self.TEXTUREHEIGHT,self.image_data=imageData.size[0],imageData.size[1],imageData.tostring(‘raw‘,‘RGBA‘,0,-1)
 71         except SystemError:
 72             self.TEXTUREWIDTH,self.TEXTUREHEIGHT,self.image_data=imageData.size[0],imageData.size[1],imageData.tostring(‘raw‘,‘RGBX‘,0,-1)
 73         assert self.TEXTUREWIDTH*self.TEXTUREHEIGHT*4 == len(self.image_data)
 74
 75
 76
 77
 78 class MyWindow(pyglet.window.Window):
 79     def __init__(self):
 80         super(MyWindow,self).__init__()
 81         #按钮
 82         self.button=Button()
 83         self.button.x=10
 84         self.button.y=10
 85         self.button.z=0
 86         self.button.width=self.width/2
 87         self.button.height=self.height/2
 88         self.button.ang=0
 89
 90         #所有要画的图元
 91         self.need_draw=[
 92                 self.button,
 93                             ]
 94     def on_draw(self):
 95         """
 96         画图,刷新
 97         """
 98         self.clear()
 99         for draw_object in self.need_draw:
100             draw_object.draw()
101     def value_change(self,dt):
102         self.button.x+=10.0
103
104
105
106
107
108 if __name__ == "__main__":
109     wn=MyWindow()
110     wn.button.load_image(‘tex.jpg‘)
111     wn.button.loadTexture()
112     clock.schedule_interval(wn.value_change,0.5)
113 pyglet.app.run()
时间: 2024-08-29 17:43:27

pyglet and opengl -- 纹理映射以及动画的相关文章

opengl纹理映射总结

大概步骤: 1.创建纹理对象,并为他指定一个纹理. 2.确定纹理如何应用到每个像素上. 3.启用纹理贴图 4.绘制场景,提供纹理和几何坐标 过滤:由于我们提供的纹理图像很少能和最终的屏幕坐标形成对应,大小不同,所以需要设置过滤项目.允许我们进行插值或者匀和,指定放大缩小的函数.glTexParameter*(),使用过滤模式GL_NEAREST那么纹理单位最邻近的将被使用,GL_LINEAR那么就用2*2的包含纹理数据的数组加权组作为纹理; 命名纹理对象:glGenTexures(GLSize

第06课 OpenGL 纹理映射

纹理映射: 在这一课里,我将教会你如何把纹理映射到立方体的六个面. 学习 texture map 纹理映射(贴图)有很多好处.比方说您想让一颗导弹飞过屏幕.根据前几课的知识,我们最可行的办法可能是很多个多边形来构建导弹的轮廓并加上有趣的颜色.使用纹理映射,您可以使用真实的导弹图像并让它飞过屏幕.您觉得哪个更好看?照片还是一大堆三角形和四边形?使用纹理映射的好处还不止是更好看,而且您的程序运行会更快.导弹贴图可能只是一个飞过窗口的四边形.一个由多边形构建而来的导弹却很可能包括成百上千的多边形.很显

OpenGL—Android 开机动画源码分析二

引自http://blog.csdn.net/luoshengyang/article/details/7691321/ BootAnimation类的成员函数movie的实现比较长,我们分段来阅读:

基于OpenGL的随机图动画演示框架与代码

基于Opengl的实时动画,为可视化科学计算过程提供了有利的工具. 然而,对于初学者来说,相关知识的学习仍需经历一个过程. 将Opengl的初始化等进行适当封装,建立了Opengl的动画框架,用户可以直接应用C语言的知识或Matlab知识,定义框架中相应的函数,即可实现实时动画程序开发,为科学计算和可视化计算提供了便利. 下面给出了Ubuntu14.04下,基于OpenGL的点线随机图动画框架. 通过分析该程序,用户可以方便地定制程序,以达到用户算法的期望. 代码如下: //第三方库: sudo

OpenGL入门学习

说起编程作图,大概还有很多人想起TC的#include <graphics.h>吧? 但是各位是否想过,那些画面绚丽的PC游戏是如何编写出来的?就靠TC那可怜的640*480分辨率.16色来做吗?显然是不行的. 本帖的目的是让大家放弃TC的老旧图形接口,让大家接触一些新事物. OpenGL作为当前主流的图形API之一,它在一些场合具有比DirectX更优越的特性. 1.与C语言紧密结合. OpenGL命令最初就是用C语言函数来进行描述的,对于学习过C语言的人来讲,OpenGL是容易理解和学习的

OpenGL笔记11

我们在前一课中,学习了简单的像素操作,这意味着我们可以使用各种各样的BMP文件来丰富程序的显示效果,于是我们的OpenGL图形程序也不再像以前总是 只显示几个多边形那样单调了.——但是这还不够.虽然我们可以将像素数据按照矩形进行缩小和放大,但是还不足以满足我们的要求.例如要将一幅世界地图绘制 到一个球体表面,只使用glPixelZoom这样的函数来进行缩放显然是不够的.OpenGL纹理映射功能支持将一些像素数据经过变换(即使是比较不规 则的变换)将其附着到各种形状的多边形表面.纹理映射功能十分强

OpenGL理解

说起编程作图,大概还有很多人想起TC的#include <graphics.h>吧? 但是各位是否想过,那些画面绚丽的PC游戏是如何编写出来的?就靠TC那可怜的640*480分辨率.16色来做吗?显然是不行的. 本帖的目的是让大家放弃TC的老旧图形接口,让大家接触一些新事物. OpenGL作为当前主流的图形API之一,它在一些场合具有比DirectX更优越的特性. 1.与C语言紧密结合. OpenGL命令最初就是用C语言函数来进行描述的,对于学习过C语言的人来讲,OpenGL是容易理解和学习的

OpenGL ES总结(一)OpenGL 初识

转载请把头部出处链接和尾部二维码一起转载,本文出自逆流的鱼yuiop:http://blog.csdn.net/hejjunlin/article/details/61615215 OpenGL是在图形图像中,非常优秀的渲染库,文中Demo下载地址:https://github.com/hejunlin2013/OpenGL31,看下今天的Agenda: OpenGL是什么? OpenGL主要功能是什么? OpenGL ES是什么? Android中如何描述OpenGL ES版本 映射坐标绘制对

【OpenGL】OpenGL初学

转载自:http://www.cppblog.com/doing5552/archive/2009/01/08/71532.html 说起编程作图,大概还有很多人想起TC的#include <graphics.h>吧? 但是各位是否想过,那些画面绚丽的PC游戏是如何编写出来的?就靠TC那可怜的640*480分辨率.16色来做吗?显然是不行的. 本帖的目的是让大家放弃TC的老旧图形接口,让大家接触一些新事物. OpenGL作为当前主流的图形API之一,它在一些场合具有比DirectX更优越的特性