AnyCAD三維控件場景節點詳解


 

SceneNode是AnyCAD三維圖形平台的AnyViz顯示引擎的核心對象之一,只有放在場景管理器(SceneManager)里的節點才能被顯示引擎所顯示。

 

1.   節點分類

SceneNode是場景節點的基類,從SceneNode繼承的子類有以下三大類:

  • EntitySceneNode

掛接顯示對象/幾何對象的節點。比如創建的TopoShape需要顯示,就需要掛接在EntitySceneNode上才能加到場景中。

為了提高內存利用率,顯示引擎允許一個TopoShape被掛接在多個EntitySceneNode上。比如一個車的兩個前輪,幾何對象可以共享。

  • CustomizedSceneNode

自定義的比較“特殊”的場景節點。從它又繼承了若干的子類。

  • GroupSceneNode

用來對場景節點進行分組。GroupSceneNode下面可以掛接各種SceneNode,包括GroupSceneNode類型。

有的組合對象也是從該類集成而來,比如GridNode, LineNode, PointNode等。

 

注意:使用GroupSceneNode可以把場景組織為的結構。假如形成,后果就很嚴重了。

        

2.   屬性設置

在SceneNode上除了可以設置幾何對象的顯示樣式如PointStyle、LineStyle、FaceStyle,設置變換矩陣等,還可以設置其他幾個你可能感興趣的屬性。

 

2.1.  矩陣變換

SceneNode:SetTransform(trf); //變換到另外一個位置。

通過GlobalInstance.MatrixBuilder可以創建平移、旋轉、縮放矩陣。

 

2.2.  設置可見性

SceneNode:SetVisible(false); //隱身

2.3.  設置是否可被選擇

SceneNode:SetPickable(false);//對象不會被鼠標拾取到了

 

2.4.  設置是否受顯示模式影響

SceneNode:SetFilterable(false);//這下切換顯示點、邊、面都不會對這個節點有影響。它里面有什么就會顯示什么。

 

2.5.  設置不受視圖縮放影響

SceneNode:SetFixedSize(true); //再怎么縮放視圖,物體的大小都不會改變了。

 

注意:所有上面的屬性都具有狀態繼承性,即在GroupSceneNode上設置,它的子節點自動具備上述屬性。

 

2.6.  Id

Id是一個神奇的屬性,給每個節點一個唯一的Id很有必要。這樣在選擇到某個SceneNode后,就可以根據它上面的Id關聯到用戶自定義數據。

另外根據Id,通過SceneManager:FindNode(id)就可以找到對應的SceneNode。

 

3.   代碼示例

3.1.  把TopoShape掛接到多個SceneNode上

如果使用的是.Net三維控件,類RenderWindow3d提供了ShowGeometry方法直接把TopoShape轉換為SceneNode。

如:

TopoShape cylinder = GlobalInstance.BrepTools.MakeCone(new Vector3(100, 0, 0), new Vector3(0, 0, 1), 20, 100, 40, 315);

SceneNode node1 = renderView.ShowGeometry(cylinder, ++shapeId);

SceneNode node2 = renderView.ShowGeometry(cylinder, ++shapeId);

//此時node1和node2是在同一個位置

//調用SceneNode:SetTransform(…)就可以把node移到其他的位置

 

3.2.  陣列

陣列本質上是改變物體的位置。對於幾何相同位置不同的物體,可以使用MatrixBuilder來構造位移矩陣,把矩陣施加到各個SceneNode上即可。

for (int i = 0; i < 10; ++i)

{

Matrix4 trf = GlobalInstance.MatrixBuilder.MakeTranslate(i * 100, 0, 0);

SceneNode aNode = renderView.ShowGeometry(cylinder, ++shapeId);

node.SetTransform(trf);

}

 

4.   練習

利用以上的API,可以創建出一個四輪汽車了吧。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM