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

AnyCAD三维控件场景节点详解的更多相关文章

  1. 《手把手教你》系列技巧篇(三十八)-java+ selenium自动化测试-日历时间控件-下篇(详解教程)

    1.简介 理想很丰满现实很骨感,在应用selenium实现web自动化时,经常会遇到处理日期控件点击问题,手工很简单,可以一个个点击日期控件选择需要的日期,但自动化执行过程中,完全复制手工这样的操作就 ...

  2. WinForm中使用AnyCAD三维控件 の 初始化

    在WinForm中可以方便的集成AnyCAD.Net三维控件,只需要以下几部即可完成. 一.添加DLL程序集 AnyCAD.Foundation.Net.dll AnyCAD.Presentation ...

  3. AnyCAD三维控件(转)

    在WinForm中可以方便的集成AnyCAD.Net三维控件,只需要以下几部即可完成. 一.添加DLL程序集 AnyCAD.Foundation.Net.dll AnyCAD.Presentation ...

  4. delphi控件属性大全-详解-简介

    http://blog.csdn.net/u011096030/article/details/18716713 button 组件: CAPTION 属性 :用于在按钮上显示文本内容 Cancel ...

  5. 《手把手教你》系列技巧篇(三十七)-java+ selenium自动化测试-日历时间控件-上篇(详解教程)

    1.简介 我们在实际工作中,有可能遇到有些web产品,网页上有一些时间选择,然后支持按照不同时间段范围去筛选数据.网页上日历控件一般,是一个文本输入框,鼠标点击,就会弹出日历界面,可以选择具体日期.这 ...

  6. iOS:选择器控件UIPickerView的详解和演示

    选择器控件UIPickerView: 功能:它能够创建一个类似于密码锁式的单列或多列的选择菜单,用户可以通过它设置的代理来选择需要菜单中的任意的数据.例如创建日历.字体表(类型.大小.颜色).图库等. ...

  7. 【VB技巧】VB ListView 控件功能使用详解

    来源:http://lcx.cc/?i=494 ListView控件 在工具箱上击鼠标右键,选择快捷菜单的Components(部件)项,在控件列表中选择Microsoft Windows Commo ...

  8. javascript遍历控件(实例详解)

    js遍历页面控件, 代码如下 复制代码  var inputArr = document.forms[0];   for( var i = 0; i < inputArr.length; i++ ...

  9. Webbrowser控件execcommand参数详解

    2D-Position 允许通过拖曳移动绝对定位的对象.AbsolutePosition 设定元素的 position 属性为“absolute”(绝对).BackColor 设置或获取当前选中区的背 ...

随机推荐

  1. jquery源码

    null  与 undefined 都是  ==null 为true alert(typeof(123))  number alert(typeof(NAN))   打印 number 不靠谱 ale ...

  2. Python深入01 特殊方法与多范式

    作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明. Python一切皆对象,但同时,Python还是一个多范式语言(multi-paradi ...

  3. IIS6.0中布署MVC站点(转)

    昨晚我写的API上线,API是vs2010 + MVC4开发的,需要布署到windows 2003 server + IIS6.0的环境中,之前一直是布在IIS7.0,比较熟悉, 换到IIS6.0,添 ...

  4. [Flex] ButtonBar系列——控制ButtonBar菜单是否可用

    <?xml version="1.0" encoding="utf-8"?> <s:Application xmlns:fx="ht ...

  5. Grub2 使用摘记

    >>>不使用子菜单 # sudo vim /etc/default/grub添加配置:GRUB_DISABLE_SUBMENU=yFrom:http://tieba.baidu.co ...

  6. UITableViewCell之微博篇

    微博篇 本应用所涉及的知识点: 1.UITableView 中的cell 2.模型的创建 3.MJExtension第三方框架的使用 需求分析 1.界面分析 微博界面 界面控件分析: 整个页面 1.不 ...

  7. VC 类泡泡龙游戏算法

    #include <stdio.h> #include <malloc.h> #include <string.h> /* 1 2 1 2 2 1 2 1 2 1 ...

  8. android 自定义组合控件 顶部导航栏

    在软件开发过程中,经常见到,就是APP 的标题栏样式几乎都是一样的,只是文字不同而已,两边图标不同.为了减少重复代码,提高效率, 方便大家使用,我们把标题栏通过组合的方式定义成一个控件. 例下图: 点 ...

  9. rlwrap(在sqlplus下使用上下键)

    一:安装readline OS的安装光盘里提供了readline包. # RHEL 4 [root@oracle11g ~]# rpm -Uvh readline* error: Failed dep ...

  10. 007 The Inheritance In JAVA

    在JAVA中有一个特型叫继承(Inheritance),通过继承我们可以重复使用代码,令代码简洁,易于扩展.例如:有一个sharp的类,这个类实现了sharp的一些方法,现在我们要写一个circle的 ...