2

一般的な問題

任意の半径の円形グラデーションを作成し、それを現在のマウス位置にマップする必要があります。このプロジェクトは主にOpenGLPySDL2を使用していますが、従来の理由からaggdrawも使用しています( Pillowラッピング PIL を使用)。大まかに言って、SDL2 は OpenGL やほとんどの UI との対話を実行しますが、aggdraw は予想通り、描画を実行します。

私は非常に初歩的な関数を書きました。マウスの動きとグラデーションの描画の間のレイテンシーがグラデーションの半径とともに劇的に増加することを除いて機能します (私のコードを参照してください。理由は明らかです)。

以下のコードは aggdraw を使用しています。aggdraw オブジェクトは、他の場所でnumpyを使用してバイト配列に変換され、OpenGL に渡されます。

私は SDL2 描画ライブラリを使用するソリューションにはオープンですが、それを使用したことは一度もありません。そのようなソリューションのナブのように扱われていただければ幸いです。;)


特定のコンテキストに関する注意事項

私が提供したコードは非常にまばらなので、礼儀として、これは私が約1年間書いてきた大きなモジュール(KLIBS)とのインターフェースであることを言及する必要があります。上記のモジュールは主に、ここでは関係のない多くのことを行いますが、以下の関数多くの社内コードにプラグインされます。残念ながら、このモジュールは (現在) ローカル コンテキスト用であるため、このモジュールのドキュメントをまだ作成していません。

ただし、この関数、文字通り、私のコードです。ライブラリの残りの部分は十分にテストされています。オーバーヘッドは、他の処理から 10 ミリ秒未満です。

画面のリフレッシュ レートよりも速くこれを実行できるに違いないと思います。最大30 ミリ秒の遅延許容値があり ます (プロジェクトのコンテキストは、視覚の認知科学における大学院の研究です)。これもハードウェアに依存することはわかっています。一般的に、私たちは 3 年以内の iMac について話している。

これはもっとうまくできると確信していますが、私は深みがありません。私は通常、Web 言語 (javascript/PHP/html/css) を使用します。

def mouse_gradient(radius):
        mp = mouse_pos()  # custom function, just wraps fetching mouse coords from sdl2
        mouse_grad = None
        mouse_grad = aggdraw.Draw('RGBA', (radius, radius), (0, 0, 0, 0))
        for n in range(radius):
            n = float(n)
            r = float(radius - n)
            opacity = int(( 0.25 * n / radius) * 100)
            brush = aggdraw.Brush((255, 0, 0), int(opacity))
            tl = (radius - r) // 2  # ie. top-left
            br = (radius - r) // 2 + r  # ie. bottom-right
            mouse_grad.ellipse((tl, tl, br, br), brush)

        return mouse_grad  # where it is subsequently blit to the screen
4

0 に答える 0