Open Inventor_节点与群组节点_以创建二氧化碳分子为例
程序员文章站
2024-02-27 12:32:03
...
节点:
节点(Node)是构成场景的基本单元,一个场景可由一个或者多个节点构成,每个节点都可以代表场景中的一个几何对象、属性对象或群组对象,以及这些对象的组合。
群组节点:
在实际的开发应用中,通常并不是使用单个的节点来完成场景的构建,因为那将为后续的操作带来诸多麻烦。对于这个问题,通常使用群组节点来完成各个节点的统一管理。
群组节点都派生自SoGroup类。因此,要创建一个群组,可以首先创建SoGroup的一个实例,然后使用addChild()函数在实例中添加相应的子节点。
以下代码是创建一个CO2分子模型。
#include <Inventor\Win\SoWin.h>
#include <Inventor\Win\viewers\SoWinExaminerViewer.h>
#include <Inventor\nodes\SoGroup.h>
#include <Inventor\nodes\SoMaterial.h>
#include <Inventor\nodes\SoSeparator.h>
#include <Inventor\nodes\SoSphere.h>
#include <Inventor\nodes\SoTransform.h>
SoGroup *makeCO2Molecule()
{
//创建所有部件
SoGroup *co2Molecule = new SoGroup;
SoGroup *carbonGroup = new SoGroup;
SoMaterial *blackPlastic = new SoMaterial;
SoSphere *spherel = new SoSphere;
SoGroup *oxygen1 = new SoGroup;
SoGroup *oxygen2 = new SoGroup;
SoTransform *oxygenXform1 = new SoTransform;
SoTransform *oxygenXform2 = new SoTransform;
SoMaterial *redPlastic = new SoMaterial;
SoSphere *sphere2 = new SoSphere;
SoSphere *sphere3 = new SoSphere;
blackPlastic->ambientColor.setValue(0, 0, 0);
blackPlastic->diffuseColor.setValue(0, 0, 0);
blackPlastic->specularColor.setValue(0.5, 0.5, 0.5);
blackPlastic->shininess = 0.5;
oxygenXform1->scaleFactor.setValue(0.75, 0.75, 0.75);
oxygenXform1->translation.setValue(-1.2, 0, 0);
oxygenXform2->translation.setValue(3.4, 0, 0);
redPlastic->ambientColor.setValue(1.0, 0, 0);
redPlastic->specularColor.setValue(0.5, 0.5, 0.5);
redPlastic->diffuseColor.setValue(1.0, 0, 0);
redPlastic->shininess = 0.5;
co2Molecule->addChild(carbonGroup);
co2Molecule->addChild(oxygen1);
co2Molecule->addChild(oxygen2);
carbonGroup->addChild(blackPlastic);
carbonGroup->addChild(spherel);
oxygen1->addChild(oxygenXform1);
oxygen1->addChild(redPlastic);
oxygen1->addChild(sphere2);
oxygen2->addChild(oxygenXform2);
oxygen2->addChild(sphere3);
return co2Molecule;
}
int main(int, char **argv)
{
//初始化open inventor和Windows
HWND myWindow = SoWin::init(argv[0]);
if (myWindow == NULL)
exit(1);
SoSeparator *root = new SoSeparator;
root->ref();
//添加所创建的场景
root->addChild(makeCO2Molecule());
SoWinExaminerViewer *myViewer = new SoWinExaminerViewer(myWindow);
myViewer->setSceneGraph(root);
myViewer->setBackgroundColor(SbColor(1.0, 1.0, 1.0));
//将背景色设置为白色
myViewer->setTitle("CO2");
myViewer->show();
myViewer->viewAll();
SoWin::show(myWindow);//显示主窗口
SoWin::mainLoop();//进入主事件循环
return 0;
}
运行后得到的图形如下:
下一篇: CUDA 学习笔记 3