0

バックグラウンド

複雑な投影設定のために Panda3D でレンズの歪みを行うために、高度に非線形のレン​​ズを実装しようとしています。このアプローチに従って、この実装を使用したいと思います。

質問

Python で実行できますか (そうであれば、どのように間違っているのでしょうか)、それとも C++ で実行する必要がありますか (そうであれば、どこから始めればよいでしょうか)?

これまでの試み

Lensのサブクラス化を試みましたが、サブクラスにスーパー コンストラクターを呼び出させる (またはコンストラクターをまったくオーバーライドしない) と、エラーが発生します。

>>> from panda3d.core import Lens
>>> class MyLens(Lens):
...    def __init__(self):
...       super(MyLens,self).__init__()
... 
>>> l = MyLens()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 3, in __init__
TypeError: Error Can Not Init Constant Class (Lens)

スーパー コンストラクター、 classisinstance(Lens)を呼び出さないが、Panda3D コードによってそのように認識されない場合:

fcamNode = Camera('fcam')
flens = MyLens.MyLens()
assert isinstance(flens, Lens)
fcamNode.setLens(flens)

になりますTypeError: LensNode.set_lens() argument 1 must be Lens, not MyLens

PerspectiveLens代わりにサブクラス化すると、スーパー コンストラクターを呼び出してクラスのインスタンスを に渡すことができsetLens()ますが、そのオーバーライドされたメソッドは呼び出されず、レンダリングされたシーンはストックでレンダリングされたように見えますPerspectiveLens

4

1 に答える 1

1

つまり、Lensクラスは内部的に C++ クラスであり、他のすべてのクラスも C++ クラスをオーバーロードする C++Lensクラスです。

このような Python でラップされたクラスをオーバーロードし、そのオブジェクトを C++ コードに再度渡すと、C++ コードは Python の上書きを認識しません。

それができるC++ スーパークラスを書くことができるかもしれませんLens。つまり、考えられるすべての仮想関数を実装し、すべての場合において、呼び出すことができる関連する Python オブジェクト属性があるかどうかを常に検索します。これは遅くなる可能性があることに注意してください。


C++ では、Lens herehereの定義があります。

FisheyeLens ここを見て、 から上書きする必要がある関数を確認してくださいLens

于 2013-10-17T12:54:15.943 に答える