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,可以創建出一個四輪汽車了吧。