簡體   English   中英

在pyglet中使用opengl渲染3d場景無需事件循環

[英]Using opengl in pyglet to render 3d scene without event loop

好吧,我在這個問題上花了很多時間,但仍然很困惑。 我希望有人可以提供一些指導、資源、類似項目等。我不確定我正在做的關於這個問題的正確方法是 go。

背景:

我正在做一個項目,我正在開發一個模擬火箭聯盟(視頻游戲)的游戲,這樣我就可以在游戲中運行強化學習算法(我不能運行游戲本身,因為它太慢了)。 模擬需要遵循 OpenAI Gym 的 API,它本質上需要一個 step 方法(它接受 AI 在該時間步確定必要的動作,並在該時間步后輸出游戲的 state),以及一個渲染方法。 我已經實現了足夠的游戲,我目前正在研究渲染方法。 我想package這個在pypi上發布,所以我選擇了pyglet來實現圖形,因為我看它是相當可移植的。

問題:

我不認為我可以使用事件循環來運行我的圖形。 設置和使用此 api 的方式是用戶首先實例化環境(視頻游戲),然后設置一個循環,在其中運行環境的步驟 function 並可選擇將渲染方法也放置在該循環中相同的循環取決於他們是否想在運行期間看到他們的 AI 的動作。 頁面上的環境下提供了一個示例用法。 所以我不能使用事件循環,因為它會停止執行用戶循環。 相反,我需要在第一次調用渲染時實例化一個 window,然后在每次后續調用時用游戲的 state 更新它。

我目前的解決方案:

    def render():
        if self.window is None:
            self.window = pyglet.window.Window(width, height)
        self.window.clear()
        self.window.dispatch_events()
          ... describe current 3d scence
        self.window.flip()

問題續:

我目前的解決方案感覺有點老套,我不喜歡,但更多的問題是我不知道如何為這個解決方案實現用戶輸入。 我希望能夠在場景周圍平移和移動相機,以便查看對象的 3 維形狀,但我不知道如何在沒有事件循環和 on_key_press 裝飾器的情況下實現它。

還:

我正在努力尋找具有 OpenGL 功能的 3d 編程的好資源(游戲是 3d)。 我想知道是否有人知道我在https://learnopengl.com/上找到的沒有所有復雜性的好地方。 我什至不知道 pyglet/opengl 是否是 go 解決這個問題的正確方法。 我對 3d 圖形知之甚少,願意接受任何建議。

因此,對於任何有類似問題尋找解決方案的人,這是我確定的:

如果您需要呈現事件但不放棄控制流到 pyglet.app.run() 或任何其他事件循環,自定義或其他方式,仍然可以監聽用戶操作。 以下代碼是 class 的示例偽實現,每次調用 render() function 時都會呈現其 state,用戶輸入可選擇更改該 state。請注意,從效率的角度來看,這是最佳選擇,您應該始終盡可能使用 pyglet.app.run() ,但此實例需要替代解決方案。

class Env:
    # ...lots of other class stuff
    def render(self):
        if self.window is None:
            self.window = pyglet.window.Window(width, height)

            @self.window.event
            def on_close():
                self.window.close()

            @self.window.event
            def on_key_press(key, mod):
                # ...do stuff on key press

        pyglet.clock.tick()
        self.window.clear()
        self.window.dispatch_events()

        # ...transform, update, create all objects that need to be rendered

        self.window.flip()


env = Env()
for _ in range(100):
    env.doStuff()
    env.render()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM