问题描述
我正在制作一个 langton 的 ant 细胞自动机程序,我希望用户能够平移和缩放。现在,我将所有矩形(网格方块)存储为字典,要移动/缩放,我遍历所有矩形并应用所需的转换。
def zoom(self,factor,center_x,center_y):
for x in range(WIDTH):
for y in range(HEIGHT):
rect = self.rects[x][y]
self.rects[x][y].x = (rect.x - center_x)*factor + center_x
self.rects[x][y].y = (rect.y - center_y)*factor + center_y
self.rects[x][y].width = rect.width * factor
self.rects[x][y].height = rect.height * factor
但是,对于矩形数量(32,000),需要一秒钟或进行平移和缩放。有没有比这更好的方法呢?谢谢!
解决方法
是的。使用 OpenGL 变换矩阵来应用变换。这些将在 GPU 上计算以提高性能。
pyglet.graphics.Group 允许您将此类转换组合在一起,以便在绘制它们时将它们自动应用于 Pyglet 基元。
示例
我们创建了一个 AND c.lft Between b.lft AND b.rgt
来平移和缩放对象。
CameraGroup
该示例假设您的窗口具有 import pyglet.gl as gl
import pyglet.shapes
class CameraGroup(Group):
def __init__(self,window,*args,**kwargs):
super().__init__(*args,**kwargs)
self.win = window
def set_state(self):
gl.glPushMatrix()
x = -(self.win.x - self.win.width // 2)
y = -(self.win.y - self.win.height // 2)
gl.glTranslatef(x,y,0.0)
gl.glScalef(self.win.factor,self.win.factor,1.0)
def unset_state(self):
gl.glPopMatrix()
、center_x
和 center_y
属性。
通过将组附加到 Pyglet 对象来应用该组。
factor
当 cam_group = CameraGroup(main_win)
rect = pyglet.shapes.Rectangle(250,300,400,200,color=(255,22,20),batch=batch,group=cam_group)
被渲染时,组转换区域会自动应用。
如果需要,您还可以构建更复杂的组。
,examples 文件夹中有一个用于 pyglet 的相机示例。
https://github.com/pyglet/pyglet/blob/pyglet-1.5-maintenance/examples/camera.py