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)

如果我不调用超级构造函数 class isinstance(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(),但它的任何重写方法都不会被调用,并且渲染的场景看起来像是用 stock 渲染的PerspectiveLens

4

1 回答 1

1

这都是用 C++ 编码的,即Lens该类在内部是一个 C++ 类,而所有其他类也是 C++ 类,它们重载了 C++Lens类。

如果您重载此类 Python 包装类并将该对象再次传递给某些 C++ 代码,则 C++ 代码将无法识别 Python 覆盖。

您也许可以编写一个Lens能够做到这一点的 C++ 超类,即实现所有可能的虚函数,并且在所有情况下,总是查找是否有可以调用的相关 Python 对象属性。请注意,这可能会很慢。


在 C++ 中,您可以找到Lens herehere的定义。

看看FisheyeLens 这里,看看你必须覆盖哪些功能Lens

于 2013-10-17T12:54:15.943 回答