【问题标题】:Pyglet- Moving many shapes at oncePyglet - 一次移动多个形状
【发布时间】:2021-02-17 21:23:30
【问题描述】:

我正在制作一个 langton's 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),进行平移和缩放需要一秒钟或一秒钟。还有比这更好的方法吗?谢谢!

Here 是完整代码

【问题讨论】:

    标签: python pyglet cellular-automata


    【解决方案1】:

    是的。使用 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()
    

    该示例假定您的窗口上有属性center_xcenter_yfactor

    通过将组附加到 Pyglet 对象来应用组。

    cam_group = CameraGroup(main_win)
    rect = pyglet.shapes.Rectangle(250, 300, 400, 200, color=(255, 22, 20), batch=batch, group=cam_group)
    

    rect 被渲染时,组转换区域会自动应用。

    如果需要,您还可以构建更复杂的组。

    【讨论】:

      【解决方案2】:

      examples 文件夹中有一个 pyglet 的相机示例。

      https://github.com/pyglet/pyglet/blob/pyglet-1.5-maintenance/examples/camera.py

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2022-12-01
        • 1970-01-01
        • 2023-04-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-01-06
        相关资源
        最近更新 更多