拖拽器是Open Inventor坐标变换节点,用来交互用户对显示物体的操作,这个例子是演示SoTranslate1Dragger关联一个SoSphere球体,用来操作拖拽器就可以相应的改变球体的位置。SoTranslate2Dragger与SoTranslate1Dragger类似,只是操作的是二维变换而已。
// 预定义COIN宏 #define COIN_DLL #define SOWIN_DLL // 加载COIN库文件 #ifdef _DEBUG #pragma comment(lib, "SoWin1d.lib") #pragma comment(lib, "Coin3d.lib") #else #pragma comment(lib, "SoWin1.lib") #pragma comment(lib, "Coin3.lib") #endif // 添加COIN头文件-Window操作显示库和节点库 #include <Inventor/Win/viewers/SoWinExaminerViewer.h> // Open Inventor在Windows下的库头文件 #include <Inventor/Win/SoWin.h> // Open Inventor节点头文件 #include <Inventor/nodes/SoSeparator.h> // Open Inventor球体节点头文件 #include <Inventor/nodes/SoSphere.h> // Open Inventor立方体节点头文件 #include <Inventor/nodes/SoCube.h> // Open Inventor材料节点头文件 #include <Inventor/nodes/SoMaterial.h> // Open Inventor变换节点头文件 #include <Inventor/nodes/SoTranslation.h> // Open Inventor操作回调节点头文件 #include <Inventor/actions/SoCallbackAction.h> // Open Inventor拖拽变换节点头文件 #include <Inventor/draggers/SoTranslate1Dragger.h> // 产生变换节点 SoNode * makeTranslation(float x, float y, float z) { SoTranslation * t = new SoTranslation; t->translation.setValue(SbVec3f(x, y, z)); return t; } // 产生Open Inventor视图场景内容 SoNode * makeSceneGraph(void) { // 此视图下根节点 SoSeparator * root = new SoSeparator; // 拖拽节点 SoSeparator * dragsep = new SoSeparator; // 拖拽节点下的移动坐标变换节点 SoTranslation * offset = new SoTranslation; // 拖拽器节点 SoTranslate1Dragger * dragger = new SoTranslate1Dragger; dragsep->addChild(offset); dragsep->addChild(new SoSphere); root->addChild(dragsep); root->addChild(makeTranslation(-3, 0, 0)); root->addChild(new SoCube); root->addChild(makeTranslation(6, 0, 0)); root->addChild(new SoCube); root->addChild(makeTranslation(-3, 2, 0)); root->addChild(dragger); offset->translation.connectFrom(&dragger->translation); return root; } int main(int argc, char ** argv) { HWND hWnd = SoWin::init(argv[0]); SoWinExaminerViewer * viewer = new SoWinExaminerViewer(hWnd); viewer->show(); SoWin::show(hWnd); viewer->setViewing(FALSE); viewer->setSceneGraph(makeSceneGraph()); SoWin::mainLoop(); delete viewer; return 0; }
效果如下