Я пытаюсь реализовать высоко нелинейный объектив для искажения объективов в Panda3D для сложной проекционной настройки. Я хочу использовать эту реализацию после этого подхода.
Могу ли я сделать это на Python (и если да, то как, что я делаю неправильно), или мне нужно сделать это в C++ (и если да, с чего начать)?
Я пробовал подклассифицировать объектив, но если я позволю своему подклассу вызвать суперконструктор (или вообще не переопределять конструктор), я получаю сообщение об ошибке:
>>> 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()
, но ни один из его переопределенных методов никогда не setLens()
, а рендеринговая сцена выглядит так, как будто она была отображена запасом PerspectiveLens
.
Это все закодировано в C++, то есть класс Lens
является внутренним классом C++, а все остальные классы также являются C++ классами, которые перегружают класс C++ Lens
.
Если вы перегружаете такой класс с оболочкой Python и передаете этот объект до некоторого кода C++, код C++ не распознает перезапись Python.
Возможно, вы сможете написать суперкомплекс C++ Lens
который может это сделать, то есть который реализует все возможные виртуальные функции и во всех случаях всегда смотрит вверх, есть связанный с ним атрибут объекта Python, который можно вызвать. Обратите внимание, что это, вероятно, будет медленным.
В C++ вы найдете определение Lens
здесь и здесь.
Взгляните на FisheyeLens
здесь, чтобы узнать, какие функции вам нужно переписать из Lens
.
Lens
(Python и C ++) без всего проекта, хотя.