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,可以创建出一个四轮汽车了吧。