案例位置:examples/Cuda/QtGUI/Qt_Pickers
功能介绍:通过鼠标交互拾取场景中的图元:
PickerNode: 对三角形面片\四边形面片、边、顶点的拾取, 支持输入TriangleSet\QuadSet;
EdgePickerNode: 对边、顶点的拾取, 支持输入EdgeSet、TriangleSet\QuadSet;
PointPickerNode:对顶点的拾取, 支持输入PointSet、EdgeSet、TriangleSet\QuadSet。
节点属性:
PickingElementType:拾取图元种类:点、线、三角面片或三者全部;
PickingType:鼠标交互方式:单击、拖拽、两者同时启用;
MultiSelectionType:多选时的交并策略:或运算(快捷键shift)、抑或运算(快捷键ctrl)、差集运算;
ToggleQuad:四边形面片拾取开关(在输入是QuadSet时启用);
ToggleFlood:扩散拾取开关:根据FloodAngle大小扩散拾取周围的面;
ToggleVisibleFilter:不可见面过滤开关;
FloodAngle:扩散拾取时周围面角度阈值;
InteractionRadius:在点拾取和线拾取时,鼠标射线的误差范围;
TriQuadIndex,EdgeIndex,PointIndex: 分别是三角/四边形面片、边拾取、点拾取拾取的结果序列;
其他参数主要控制拾取和未拾取部分的渲染效果。
案例介绍:
在用户需要拾取图元时,通过鼠标单击或拖拽的方式进行拾取;
需要多选时,按住快捷键ctrl或shift来进行或运算或抑或运算的多选拾取;
需要扩散拾取某一面时,打开ToggleFlood开关,并将FloodAngle调到适宜位置;
需要对不可见面过滤时,打开ToggleVisibleFilter开关;
可以根据节点参数进行拾取功能调整选择。
接下来介绍案例的实现过程:
std::shared_ptr<SceneGraph> scn = std::make_shared<SceneGraph>();
auto pickerNode = scn->addNode(std::make_shared<PickerNode<DataType3f>>());
auto cube1 = scn->addNode(std::make_shared<CubeModel<DataType3f>>());
cube1->varLocation()->setValue(Vec3f(0.0f, 0.0f, 0.0f));
cube1->setVisible(false);
cube1->varSegments()->setValue(Vec3i((uint)6, (uint)6, (uint)6));
cube1->stateQuadSet()->connect(pickerNode->inTopology());
cube1->stateQuadSet()->promoteOuput();
auto pointPickerNode = scn->addNode(std::make_shared<PointPickerNode<DataType3f>>());
auto cube2 = scn->addNode(std::make_shared<CubeModel<DataType3f>>());
cube2->varLocation()->setValue(Vec3f(-1.25f, 0.0f, 1.25f));
cube2->setVisible(false);
cube2->varSegments()->setValue(Vec3i((uint)6, (uint)6, (uint)6));
auto cubeSampler = scn->addNode(std::make_shared<CubeSampler<DataType3f>>());
cube2->outCube()->connect(cubeSampler->inCube());
cubeSampler->statePointSet()->connect(pointPickerNode->inTopology());
cubeSampler->statePointSet()->promoteOuput();
auto edgePickerNode = scn->addNode(std::make_shared<EdgePickerNode<DataType3f>>());
auto cube3 = scn->addNode(std::make_shared<CubeModel<DataType3f>>());
cube3->varLocation()->setValue(Vec3f(1.25f, 0.0f, -1.25f));
cube3->setVisible(false);
cube3->varSegments()->setValue(Vec3i((uint)6, (uint)6, (uint)6));
cube3->stateQuadSet()->connect(edgePickerNode->inTopology());
cube3->stateQuadSet()->promoteOuput();