在Panda3D中实现我自己的镜头



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覆盖哪些功能。

相关内容

  • 没有找到相关文章

最新更新