在Panda3D中实现我自己的镜头

时间:2013-10-16 09:25:40

标签: c++ python panda3d

背景

我正在尝试使用高度非线性镜头在Panda3D中进行镜头失真,以实现复杂的投影设置。我想在this approach之后使用此实现。

问题

我可以用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渲染的。

1 个答案:

答案 0 :(得分:1)

这全部用C ++编写,即Lens类在内部是C ++类,所有其他类也是C ++类,它们重载C ++ Lens类。

如果重载这样的Python包装类并再次将该对象传递给某些C ++代码,则C ++代码不会识别Python覆盖。

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


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

查看FisheyeLens here,了解您必须从Lens覆盖哪些功能。