Задний план

Я пытаюсь реализовать сильно нелинейный объектив для искажения объектива в 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.

0
Johannes Bauer 16 Окт 2013 в 13:25

1 ответ

Лучший ответ

Все это закодировано на C ++, т.е. класс Lens внутренне является классом C ++, а все другие классы также являются классами C ++, которые перегружают класс C ++ Lens.

Если вы перегрузите такой класс, завернутый в Python, и снова передадите этот объект в некоторый код C ++, код C ++ не распознает перезапись Python.

Возможно, вы сможете написать суперкласс C ++ Lens, который сможет это сделать, т.е. который реализует все возможные виртуальные функции и во всех случаях всегда будет искать, есть ли связанный атрибут объекта Python, который можно вызвать. Обратите внимание, что это, скорее всего, будет медленным.


В C ++ вы найдете определение Lens здесь и здесь.

Взгляните на FisheyeLens здесь чтобы узнать, какие функции нужно перезаписать из Lens.

1
Albert 18 Окт 2013 в 13:05
Спасибо, это отвечает на половину моего вопроса. Я приму первый ответ, который даст мне лишь подсказку, с чего начать реализацию пользовательского объектива на C ++, поскольку это было частью моего первоначального вопроса. (Конечно, я также сам изучу это, как только у меня будет возможность, и вернусь сюда, обновлю и приму соответственно)
 – 
Johannes Bauer
17 Окт 2013 в 19:51
This и охватывает эту тему. Мне интересно, могу ли я создать (и распространить) Lens (Python и C ++) без всего проекта.
 – 
Johannes Bauer
18 Окт 2013 в 20:00
Вы реализовали новый объект Lens? У вас есть где-нибудь код?
 – 
gr4viton
16 Апр 2021 в 01:56