拖拽器是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;
}
效果如下