拾取功能

1、拾取功能

案例位置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开关;

  • 可以根据节点参数进行拾取功能调整选择。

2、程序实现

接下来介绍案例的实现过程:

  • 创建场景图及边界:
	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();