节点的类型
节点是组成图形场景的基本元素。它内部包含用于定义 3D 形体、属性、或组的数据和
方法。当创建了一个节点,这个节点会被当作根节点自动地保存到场景数据库中。通常的情况下,可以通过将节点与数据库中的其它节点相连接,构造出一种具有分层关系的场景。
节点可以分为三大基本类:
形体节点(Shape nodes),代表3D几何模型。
属性节点(Property nodes),表现对象的外观或其它场景特征。
组节点(Group nodes),是一种将节点聚合包含进场景中的容器(containers)。
创建节点
使用 C++ new 操作符来创建一个节点,例如:
SoSphere *headSphere = new SoSphere;
注意:不要创建节点数组。(具体原因见后面的“怎样删除节点”章节)。(既不能这样程序,
SoSphere *headSphere = new SoSphere[5]。译者注)
注意:尽管是使用 new 操作符创建了新节点,但却不能使用 delete 操作符删除它们。
在后面的“如何删除节点”章节中,将详细讨论如何在 Inventor 中删除节点,以及节点何时
被删除的问题。理解“引用计数”的原理对于我们使用 Inventor 是至关重要的,因为我们必
须知道在什么样的条件下,节点会被自动删除。
节点里有什么 ?
每个节点都是由一组叫做“域”的用于描述节点参数的数据元素组成的。例如,一个点光源节点(SoPointLight)包含了四个域:intensity(亮度)、color(颜色)、location(位置)和on(开关)。intensity里包含有一个从 0.0 (无光)到 1.0 (最亮)的变量值。color用于设置光源的红/绿/蓝照明色。location用于指定光源的位置。on指定灯光是否处于开的状态。
Inventor定义了许多域的类型。每种域类型都有唯一的方法来访问其数据。在每个节点中,根据域的用途,每个域都被命名了相应的名称。
当对节点执行动作时发生了什么? (高级内容)
每个节点都会执行自己的动作行为(Each node implements its own action behavior)。当需要对场景执行一 个特定的动作时,我们必须首先要创建一个动作类的实例例,SoGLRenderAction或SoGetBoundingBoxAction),然后再将这个动作应用到场景的根节点上。数据库对每个动作都管理着一个叫做遍历状态(traversal state)的数据结构,这个数据结构是在某个给定时刻内动作的元素与参数的集合。通常,当执行一次动作时,动作将按照从上到下,从左到右的顺序遍历整个场景。在遍历的过程中,节点将根据它们对此次动作所做的特定行为来修改遍历状态。
本节将集中讨论OpenGL 渲染动作(OpenGL rendering action),因为创建3D场景的最主要动机之一就是为了观察和操作3D对象。渲染遍历状态是由一组可以被给定的节点类修改的元素所组成的。当执行一个渲染动作时,将以指定的方式使用和解释每个元素。下面列出了少数的几种在遍历状态中使用的元素:
当前几何变换。
当前的材质成份。
当前光照模型。
当前绘制风格。
当前字体。
当前坐标系。
当前法向向量
当前灯光。
当前观察方式(Current viewing specification)(主要是定义平行投影,还是透视投影。译
者注)
举例来说,SoMaterial节点用于设置遍历状态中各种材质元素的当前值,
SoDrawStyle节点用于设置遍历状态中绘制风格元素的当前值。
还有像SoSphere这类的形体节点,对渲染遍历来说是尤其重要的。因为在渲染的时候,这类节点会使用遍历状态的当前参数,将它们自己形状绘制在屏幕上。
形体节点
形体节点用于表示一种3D几何对象。它们比较特殊,因为它们代表的是一些受属性节
点和组节点影响的实际物体。在执行渲染动作期间,它们实际上会将自己形状绘制在屏幕上。
形体节点类包括:SoSphere、SoIndexedFaceSet 和SoText3 等类。
属性节点
属性节点代表的是像“表面材质”、“绘制风格”、或“几何变换”等这些用于展现场景
外观和特有性质的节点。属性节点可以分成若干类,场景图一般使用三种不同的图标来表示它们:
变换类图标:表示执行几何变换的属性节点,像SoTransform、SoRotation、SoScale、
SoTranslation、SoRotationXYZ 和SoResetTransform等节点。这些节点都是从
SoTransformation派生出来的。
外观类图标:表示可以修改对象外观的属性节点,像SoMaterial、SoBaseColor 、
SoMaterialBinding、SoComplexity、SoDrawStyle、SoLightModel 和SoFont。
度量类图标:示包含有坐标系、法线、或其它几何信息的节点,像SoCoordinate3、
SoCoordinate4、SoProfileCoordinate2、SoProfileCoordinate3、SoNormal和SoNormalBinding。
通常,在遍历过程中,属性节点将自己的新值替换掉在遍历状态中相应元素的值.几何变换节点是一个例外,它们会和当前几何变换进行累积运算。
SoTransform节点可以产生几何变换,它包含有缩放域、旋转域、平移域。下面的代码
定义了一个沿着y轴方向平移-1 单位的几何变换节点。
SoTransform *myXform = new SoTransform;
// set field value
myXform->translation.setValue(0.0, -1.0, 0.0);
为了使这个变换产生效果,这个节点必须要插入到场景的某个适当位置上。(这里是插
在需要平移的形体节点之前)。