Реализация моей собственной линзы в Panda3D
Фон
Я пытаюсь реализовать высоко нелинейный объектив для искажения объектива в 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
,
1 ответ
Это все написано в C++, то есть Lens
класс внутренне является классом C++, а все остальные классы также являются классами C++, которые перегружают C++ Lens
учебный класс.
Если вы перегружаете такой класс, заключенный в Python, и снова передаете этот объект в некоторый код C++, код C++ не распознает перезапись Python.
Вы могли бы написать C++ Lens
Суперкласс, который способен это сделать, т.е. который реализует все возможные виртуальные функции и во всех случаях всегда смотрит вверх, если есть связанный атрибут объекта Python, который можно вызвать. Обратите внимание, что это может быть медленно.
В C++ вы найдете определение Lens
здесь и здесь.
Посмотрите на FisheyeLens
здесь, чтобы увидеть, какие функции вы должны перезаписать с Lens
,