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. Mac下Tomcat启动时乱码

    #JAVA_OPTS="$JAVA_OPTS -Dorg.apache.catalina.security.SecurityListener.UMASK=`umask`" 我是直接 ...

  2. Mac 上SVN上传.a文件

    SVN默认是忽略.a文件,所以修改配置文件去掉忽略配置行的 *.a 通过终端打开配置文件: open ~/.subversion/config 把下面两行(也可能是一行)中的注释和*.a去掉, #gl ...

  3. Python补充03 Python内置函数清单

    作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明. Python内置(built-in)函数随着python解释器的运行而创建.在Pytho ...

  4. 开一个帖子,等有时间了写写如何用shapelib创建点线面等shp图层

    开一个帖子,等有时间了写写如何用shapelib创建点线面等shp图层  C#操作shapelib的实例 http://files.cnblogs.com/yuxuetaoxp/Shapelib--D ...

  5. poj 2240 Arbitrage bellman-ford算法

    点击打开链接 Arbitrage Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 13434   Accepted: 5657 ...

  6. 菜鸟-手把手教你把Acegi应用到实际项目中(1.1)

    相信不少朋友们对于学习Acegi的过程是比较痛苦的,而且可能最初一个例子都没能真正运行起来.即使能运行起来,对于里面那么多的配置,更搞不清楚为什么要那么配,多配一个和少配一个究竟有什么区别? 最终头都 ...

  7. JavaScript对象的创建之动态原型方式

    为了让定义的方式更加符合java的需求,就把定义方法的原型代码放置在Person这个构造函数中. function Person(name,age,friends){ //属性在构造函数中定义 thi ...

  8. JSP SQL注入--破法

    1.JS验证拦截 <%@ page language="java" import="java.util.*" pageEncoding="UTF ...

  9. AngularJs 入门系列-1 使用 AngularJs 搭建页面基本框架

    每当看到前端程序员在脚本.样式.表单处理逻辑中苦苦挣扎的时候,我就在想,为什么不用Angular Js 呢? Angular Js 支持页面前端的 MVC 模式开发,在 Angular JS 的支持下 ...

  10. cocos2d-x 中添加显示文字的三种方式 LabelTTF 、LabelBMFont 和 LabelAtlas

    在 cocos2d-x 中有三个类可以在层或精灵中添加文字: LabelTTF LabelBMFont LabelAtlas LabelTTF 直接支持使用 TTF 字库,可以支持全部的中文,但是效率 ...