2017-09-25 70 views
0

添加卡爾回調到節點的正確的方式我有通過覆蓋橫動方法處理一個卡爾回調代碼:在OpenSceneGraph的

void SomeNode::traverse(osg::NodeVisitor& nv) 
{ 
    if (nv.getVisitorType() == osg::NodeVisitor::CULL_VISITOR) 
    { 
     //adjust child node positions depending on the projection 
    } 
} 

但看起來像有一種替代方法如何添加卡爾用

void Node::setCullCallback(Callback* nc); 

哪一個更好,在什麼情況下?第一種方法是正確的嗎?

回答

0

最常見的方法是在節點上設置Cull回調,因爲它不需要您編寫自定義osg :: Node派生類。因此,您可以將回調添加到任何現有節點類型,特別是從文件加載的模型。

它也非常靈活,因爲您可以在運行時輕鬆添加/刪除/替換回調。

在這兩種情況下,如果在感興趣的節點上激活活動,只有當節點通過剔除測試時,纔會調用traverse()方法或回調。

+0

這個代碼重寫遍歷方法是不是很正確,因爲如果有多個Cull回調添加到一個節點,遍歷方法會多次執行(對於每個添加的collback),理論上不應該只有' nv.getVisitorType()== osg :: NodeVisitor :: CULL_VISITOR'條件,在遍歷方法中,還有類似dynamic_cast 的代碼對每種類型的Cull Visitor都有不同的工作方式。 – Koban

+0

@Koban不確定你的意思,因爲你似乎混合了剔除訪問者和剔除回調的概念。通常,您的節點將通過與活動攝像機數量一樣多的遍歷遍歷來訪問每個幀。用於每個剔除遍歷的缺省類是osgUtil :: CullVisitor。你的回調將在每次訪問時被調用一次(考慮到我在答案中提到的剔除測試) – rickyviking