1

編集:最小限の失敗したテストケースがここのgithubにあります: https ://github.com/shadowmint/Panda-setRamImage-problem

-

符号なしのchar*ポインタをRGBピクセルデータを含むPythonに返すCライブラリがあります。

これを行うためのPythonAPIは次のとおりです。

# unsigned char *ar_get_rgb(void *handle);
libar.ar_get_rgb.argtypes = [ c_void_p ]
libar.ar_get_rgb.restype = POINTER(c_char)

panda3dでは、このデータをテクスチャとしてレンダリングしようとしています。その方法についてのブログ投稿がここにあります:http: //www.panda3d.org/blog/?p = 96

ただし、これを行うにはかなり深刻な制限があることがわかりました。これについては、http://www.panda3d.org/forums/viewtopic.php?t = 13183で説明しました。その結果、現在、次のことを試みています。 setRamImage()APIを使用して、テクスチャメモリを設定します。

これを行う方法があるはずですが、現時点で私ができる唯一の方法は、次のように、テクスチャでピクセルごとのセット呼び出しを使用することです。

  def updateTextureTask(self, t):
    expectedSize = self.getExpectedRamImageSize()
    print("Expected length: " + str(expectedSize))
    (rgb, depth) = self.__vision.next()
    p = PTAUchar.emptyArray(expectedSize)
    for i in range(0, self.__vision.width * self.__vision.height * 3):
      p.setElement(i, ord(rgb[i]))
    print("PTAU length: " + str(p.size()))
    self.setRamImage(CPTAUchar(p))
    return Task.cont

これは機能します...しかし、2秒ごとに見事な1フレームで実行されます。

p.setData(rgb)を呼び出してPTAUcharのデータを設定すると(ヒント: http: //www.panda3d.org/dox/python/html/classpanda3d_1_1core_1_1PTAUchar.html)次のようになります。

Expected length: 921600
RGB buffer size: 921600 <-- C debugging data
PTAU length: 4
Assertion failed: compression != CM_off || image.size() == do_get_expected_ram_image_size() at line 833 of panda/src/gobj/texture.cxx
Traceback (most recent call last):

RGB配列の最初の20個の奇数値のダンプは次のようになっているため、この「4」の長さがどこから来ているのか困惑しています。

0: 163, 1: 151, 2: 162, 3: 85, 4: 83, 5: 190, 6: 241, 7: 252, 8: 249, 9: 121, 10: 107, 11: 82, 12: 20, 13: 19, 14: 233, 15: 226, 16: 45, 17: 81, 18: 142, 19: 31
PTAU length: 4

unsigned char *配列を、PTAUchar.setDataまたはPTAUchar.setSubdataにフィードできるものに変換する方法が必要ですが、理解できません。

ヘルプ!

4

1 に答える 1

1

setData関数の定義は次のとおりです。

PTAUchar.setData(string data)

文字列を渡していない。文字列へのポインタを渡しています。あなたがやりたいのは、CライブラリにPythonバイト文字列をPythonコードに渡してもらい、それをに渡すことだと思いますsetData

PS:freenodeで#panda3dに来るのは、リアルタイムのヘルプを得るのに最適な場所です。

于 2012-04-10T17:11:00.057 に答える