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