Задний план
Я пытаюсь реализовать сильно нелинейный объектив для искажения объектива в 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
.
Похожие вопросы
Новые вопросы
c++
C ++ - это язык программирования общего назначения. Первоначально он был разработан как расширение C и имеет аналогичный синтаксис, но теперь это совершенно другой язык. Используйте этот тег для вопросов о коде (который должен быть) скомпилирован с помощью компилятора C ++. Используйте тег для конкретной версии для вопросов, связанных с конкретной версией стандарта [C ++ 11], [C ++ 14], [C ++ 17], [C ++ 20] или [C ++ 23] и т. Д. .
Lens
(Python и C ++) без всего проекта.