Pygletでバッチを作成しようとするとき、「エラーを開梱するには値が多すぎます」

StackOverflow https://stackoverflow.com/questions/4494705

  •  12-10-2019
  •  | 
  •  

質問

私はPygletでバッチを動作させようとしていますが、エラーメッセージ「編成にはあまりにも多くの値」から完全に混乱しています。 pyglet/graphics/__init__.py ファイル。私の推測では、バッチにジオメトリを追加するときに、私が何か間違ったことをしていると思います。

エラーを作成する必須部分にコードを削減します。

from pyglet.gl import *
from pyglet.graphics import *
import pyglet

batch = pyglet.graphics.Batch()
img = pyglet.image.load('pic.png')
texture = img.get_texture()

class TextureEnableGroup(pyglet.graphics.Group):
    def set_state(self):
        glEnable(GL_TEXTURE_2D)
    def unset_state(self):
        glDisable(GL_TEXTURE_2D)

texture_enable_group = TextureEnableGroup()

class TextureBindGroup(pyglet.graphics.Group):
    def __init__(self, texture):
        super(TextureBindGroup, self).__init__(parent=texture_enable_group)
        self.texture = texture
    def set_state(self):
        glBindTexture(GL_TEXTURE_2D, self.texture.id)
        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR)
        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR)
    def __eq__(self, other):
        return (self.__class__ is other.__class__ and self.texture == other.__class__)

batch.add(12, GL_TRIANGLES, TextureBindGroup(texture), (('t2f', (0, 0)), ('v3f', (64, 64, 0)), ('t2f', (1, 1)), ('v3f', (-64, -64, 205)), ('t2f', (0, 1)), ('v3f', (-64, 64, 205)), ('t2f', (1, 1)), ('v3f', (64, -64, 205)), ('t2f', (1, 0)), ('v3f', (64, 64, 0)), ('t2f', (0, 1)), ('v3f', (-64, -64, 205))))
役に立ちましたか?

解決 4

Marcogのおかげで、スクリプトの正しい最終行は次のとおりです。

batch.add(6, GL_TRIANGLES, TextureBindGroup(texture), ('v3i', (64, 64, 0, -64, -64, 205, -64, 64, 205, 64, -64, 205, 64, 64, 0, -64, -64, 205)), ('t2i', (0, 0, 1, 1, 0, 1, 1, 1, 1, 0, 0, 1)))

IE問題解決=)

問題は、すべてのデータを単一のタプル(Marcogが指摘した)としてすべてのデータを送信し、Geeometryデータのバッチの長さの間違った値を渡すことでした。 12の代わりに6つの頂点。

他のヒント

あなたの問題はこの行にあります:

batch.add(12, GL_TRIANGLES, TextureBindGroup(texture), (('t2f', (0, 0)), ('v3f', (64, 64, 0)), ('t2f', (1, 1)), ('v3f', (-64, -64, 205)), ('t2f', (0, 1)), ('v3f', (-64, 64, 205)), ('t2f', (1, 1)), ('v3f', (64, -64, 205)), ('t2f', (1, 0)), ('v3f', (64, 64, 0)), ('t2f', (0, 1)), ('v3f', (-64, -64, 205))))

私はそれがあるべきだと信じています:

batch.add(12, GL_TRIANGLES, TextureBindGroup(texture), ('t2f', (0, 0)), ('v3f', (64, 64, 0)), ('t2f', (1, 1)), ('v3f', (-64, -64, 205)), ('t2f', (0, 1)), ('v3f', (-64, 64, 205)), ('t2f', (1, 1)), ('v3f', (64, -64, 205)), ('t2f', (1, 0)), ('v3f', (64, 64, 0)), ('t2f', (0, 1)), ('v3f', (-64, -64, 205)))

最後の引数をフォーマットからどのように変更したかに注目してください ((tuple), (tuple))(tuple), (tuple)). 。私はPygletに精通していませんが、これが正しい呼び出し方法であることを発見しました batch.add() から ドキュメンテーション. 。ご了承ください *data ファンクションコールの最後にあるパラメーターの変数リストを表します。これは、タプルや試みたようなリストではありません。

それを試して、それがあなたのためにどのように機能するかを教えてください。

「解き放つには値が多すぎる」は、あなたがするときに得られるエラーです

a, b = "a b c".split(" ")

分割は3つの値を返しますが、それらを2つに貼り付けます。その最後の行のどこかに括弧が間違っていると思います。そのためには、より明確な構文を使用してみてください。今ではそれは非常に恐ろしく、読みにくいです。

私はあなたの4番目の議論だと思います batch.add() Pygletが期待する形式には従いません。これを確認すると便利かもしれません。

また、エラーが発生するPygletの線を見ると、より多くの情報が得られる可能性があります。問題は、Pyglet関数に渡す引数の問題になる可能性があります。

PS: ドキュメンテーション にとって add 興味深いかもしれません。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top