Реализация моей собственной линзы в Panda3D

0

Задний план

Я пытаюсь реализовать высоко нелинейный объектив для искажения объективов в 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(), но ни один из его переопределенных методов никогда не setLens(), а рендеринговая сцена выглядит так, как будто она была отображена запасом PerspectiveLens.

Теги:
panda3d

1 ответ

1
Лучший ответ

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

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

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


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

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

  • 0
    Спасибо, это отвечает на половину моего вопроса. Я приму первый ответ, дающий мне лишь подсказку о том, с чего начать реализацию пользовательского объектива в C ++, поскольку это было частью моего первоначального вопроса. (Конечно, я также сам разберусь с этим, как только у меня появится возможность, и вернусь сюда, обновлю и приму соответственно)
  • 0
    Это и это охватывает тему. Мне интересно, смогу ли я построить (и распространить) Lens (Python и C ++) без всего проекта, хотя.
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню