2013-10-16 57 views
0
實現我自己的鏡頭

背景

我想實現一個高度非線性的鏡頭做鏡頭畸變的Panda3D一個複雜的投影設置。我想在this approach之後使用此實現。在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++類Lens C++類。

如果您重載了這種Python包裝的類並將該對象再次傳遞給某些C++代碼,那麼C++代碼將無法識別Python覆蓋。

你也許可以編寫一個C++ Lens超類,它可以做到這一點,即它實現了所有可能的虛函數,並且在任何情況下,總是查找有相關的Python對象屬性可以調用。請注意,這可能會很慢。


在C++中,你會發現的Lensherehere的定義。

看看FisheyeLenshere看看你必須覆蓋哪些功能從Lens

+0

謝謝,這回答了我的問題的一半。我會接受第一個答案,只是提示我在哪裏開始實現C++定製鏡頭,因爲這是我原來的問題的一部分。 (當然,我也會在我有機會的時候自己調查一下,然後回到這裏,更新並接受) –

+0

[This](https://www.panda3d.org/manual/index.php/Subclassing)和[this](http://panda3d.cvs.sourceforge.net/viewvc/panda3d/doc/INSTALL-MK?view=markup)涵蓋了這個主題。不過,我想知道是否可以在沒有整個項目的情況下構建(並分發)「Lens」(Python和C++)。 –

+0

[我可以](http://www.panda3d.org/forums/viewtopic.php?f=12&t=16501&p=96382)。 –