Background
我正在尝试实现一个高度非线性的镜头,以便在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)
如果我不调用超级构造函数,则类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()
,但从未调用过它的任何重写方法,渲染的场景看起来像是用股票PerspectiveLens
渲染的。
这都是用C++编码的,即Lens
类在内部是一个C++类,所有其他类也是重载C++ Lens
类的C++类。
如果重载此类 Python 包装的类并将该对象再次传递给某些C++代码,则C++代码将无法识别 Python 覆盖。
你也许可以编写一个能够做到这一点的C++ Lens
超类,即它实现了所有可能的虚函数,并且在所有情况下,总是查找是否有相关的 Python 对象属性可以调用。请注意,这可能很慢。
在C++,你可以在这里和这里找到Lens
的定义。
看看这里的FisheyeLens
,看看你必须从Lens
覆盖哪些功能。