Pyglet-一次移动多个形状
Pyglet- Moving many shapes at once
我正在制作一个 langton 的蚂蚁元胞自动机程序,我希望用户能够平移和缩放。现在,我将所有矩形(网格正方形)存储为字典,为了 move/zoom,我遍历所有矩形并应用所需的转换。
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),平移和缩放需要一秒钟的时间。有比这更好的方法吗?谢谢!
Here是完整代码
是的。使用 OpenGL 转换矩阵来应用转换。这些将在 GPU 上计算以提高性能。
pyglet.graphics.Group 让您可以将这些变换组合在一起,以便在绘制它们时将它们自动应用于 Pyglet 图元。
例子
我们创建了一个 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()
该示例假定您在 window.
上具有属性 center_x
、center_y
和 factor
通过将组附加到 Pyglet 对象来应用该组。
cam_group = CameraGroup(main_win)
rect = pyglet.shapes.Rectangle(250, 300, 400, 200, color=(255, 22, 20), batch=batch, group=cam_group)
当 rect
渲染时,自动应用组变换区域。
如果需要,您还可以构建更复杂的组。
示例文件夹中有 pyglet 的相机示例。
https://github.com/pyglet/pyglet/blob/pyglet-1.5-maintenance/examples/camera.py
我正在制作一个 langton 的蚂蚁元胞自动机程序,我希望用户能够平移和缩放。现在,我将所有矩形(网格正方形)存储为字典,为了 move/zoom,我遍历所有矩形并应用所需的转换。
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),平移和缩放需要一秒钟的时间。有比这更好的方法吗?谢谢!
Here是完整代码
是的。使用 OpenGL 转换矩阵来应用转换。这些将在 GPU 上计算以提高性能。
pyglet.graphics.Group 让您可以将这些变换组合在一起,以便在绘制它们时将它们自动应用于 Pyglet 图元。
例子
我们创建了一个 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()
该示例假定您在 window.
上具有属性center_x
、center_y
和 factor
通过将组附加到 Pyglet 对象来应用该组。
cam_group = CameraGroup(main_win)
rect = pyglet.shapes.Rectangle(250, 300, 400, 200, color=(255, 22, 20), batch=batch, group=cam_group)
当 rect
渲染时,自动应用组变换区域。
如果需要,您还可以构建更复杂的组。
示例文件夹中有 pyglet 的相机示例。
https://github.com/pyglet/pyglet/blob/pyglet-1.5-maintenance/examples/camera.py