OIV 之节点组(基于COIN 3D)

 当渲染 waterMolecule 节点时,waterMolecule 节点将首先访问它的第一个子节点oxygen。
 然后oxygen组节点将按照下面的顺序分别访问它自己的子节点:

 1. 材质节点(redPlastic)将当前遍历状态中的材质元素修改成有红色光泽的材质。
 2. 球体节点(sphere1)将使用当前的遍历状态渲染一个球体。一个有红色光泽的球体将被绘制在坐标原点的位置上。 场景继续遍历右

     边的下一个组节点 hydrogen_H1,这个组节点同样按照从左到右的顺序依
 次访问它的每个子节点:

 1. 几何变换节点(hydrogenXform1)修改了变换矩阵(也就是说,它在 x,y,z 轴上等比缩小了 75%)。同时它还为变换矩阵增加上

    了一 个0.0, -1.2, 0.0(分别在 x,y,z轴方向)的平移变换。
 2. 材质节点(whitePlastic_H12)将当前遍历状态中的材质元素修改成有白色光泽的材质。
 3. 球体节点(sphere_H12) 将使用修改过的遍历状态渲染另一个球体。这个球体是白色的。
 另外,因为在它的组节点中有SoTransform节点(hydrogenXform1),所以sphere_H1显示在一个 新的位置上,并且它的大小也是

按比 例缩小的。

 接下来,hydrogen2 组节点按照从左到右的顺序访问它的子节点:

 1. 几何变换节点(hydrogenXform2)修改变换矩阵,在+x 轴和+y 轴方向进行了平移。
 2. 球体节点(sphere_H23)将使用修改过的遍历状态渲染第三个球体。这个球仍然是白色
    的,并且也被缩小了 0.75,这是因为它继承了在 hydrogen1 组节点中的属性。

 #include "OivDef.h" // 水分子 SoGroup * makeWaterMolecule() { ////////////////////////////////////////////////////////////// // CODE FOR The Inventor Mentor STARTS HERE // Construct all parts SoGroup *waterMolecule = new SoGroup; // water molecule 水分子 SoGroup *oxygen = new SoGroup; // oxygen atom 氧原子 SoMaterial *redPlastic_O = new SoMaterial; SoSphere *sphere_O = new SoSphere; SoGroup *hydrogen1 = new SoGroup; // hydrogen atoms 2个氢原子 SoGroup *hydrogen2 = new SoGroup; SoTransform *hydrogenXform1 = new SoTransform; SoTransform *hydrogenXform2 = new SoTransform; SoMaterial *whitePlastic_H12 = new SoMaterial; SoSphere *sphere_H1 = new SoSphere; SoSphere *sphere_H2 = new SoSphere; // Set all field values for the oxygen atom 氧原子 材质 redPlastic_O->ambientColor.setValue(1.0f, 0.0f, 0.0f); //环境 redPlastic_O->diffuseColor.setValue(1.0f, 0.0f, 0.0f); //反射 redPlastic_O->specularColor.setValue(0.5f, 0.5f, 0.5f);//镜面 redPlastic_O->shininess = 0.5; // Set all field values for the hydrogen atoms 氢原子 hydrogenXform1->scaleFactor.setValue(0.75f, 0.75f, 0.75f); //缩放 hydrogenXform1->translation.setValue(0.0f, -1.2f, 0.0f); //放置 位置 //hydrogenXform1->scaleFactor.setValue(0.25f, 0.75f, 0.75f); //缩放 hydrogenXform2->translation.setValue(1.1852f, 1.3877f, 0.0f);//放置 位置 //氢原子 --材质 whitePlastic_H12->ambientColor.setValue(1.0f, 1.0f, 1.0f); whitePlastic_H12->diffuseColor.setValue(1.0f, 1.0f, 1.0f); whitePlastic_H12->specularColor.setValue(0.5f, 0.5f, 0.5f); whitePlastic_H12->shininess = 0.5; // Create a hierarchy 等级结构:和加载顺序有很大关系 //当渲染waterMolecule 节点时,waterMolecule 节点将首先访问它的第一个子节点xygen waterMolecule->addChild(oxygen); //1 waterMolecule->addChild(hydrogen1); //2 waterMolecule->addChild(hydrogen2); //3 oxygen->addChild(redPlastic_O); oxygen->addChild(sphere_O); hydrogen1->addChild(hydrogenXform1); hydrogen1->addChild(whitePlastic_H12); hydrogen1->addChild(sphere_H1); hydrogen2->addChild(hydrogenXform2); hydrogen2->addChild(sphere_H2); // CODE FOR The Inventor Mentor ENDS HERE ////////////////////////////////////////////////////////////// return waterMolecule; } int main(int, char **argv) { // Initialize Inventor and Win HWND myWindow = SoWin::init(argv[0]); if (myWindow == NULL) exit(1); SoSeparator *root = new SoSeparator; root->ref(); // This function contains our code fragment. root->addChild(makeWaterMolecule()); //观察器 SoWinExaminerViewer *myViewer = new SoWinExaminerViewer(myWindow); myViewer->setSceneGraph(root); myViewer->setTitle("H two O---H2O"); myViewer->show(); myViewer->viewAll(); SoWin::show(myWindow); SoWin::mainLoop(); root->unref(); return 0; }

 

你可能感兴趣的:(function,null,hierarchy)