Реализация моей собственной линзы в 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,

Другие вопросы по тегам