Pygletでバッチを作成しようとするとき、「エラーを開梱するには値が多すぎます」
質問
私は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
興味深いかもしれません。