鼠标交互

1、鼠标交互

该功能主要用于相应鼠标事件,包括鼠标移动、点击和释放。当鼠标发出不同指令时,程序会调用不同的接口,便于用户和仿真程序的交互。

2、程序实现

  • 创建场景图:
	std::shared_ptr<SceneGraph> scn = std::make_shared<SceneGraph>();
  • 创建仿真实例模型:
 	auto instanceNode = scn->addNode(std::make_shared<Instances>());

	class Instances : public Node
	{
	public:
		Instances() {
			Transform3f tm;
			CArray<Transform3f> hTransform;
			for (uint i = 0; i < 5; i++)
			{
				tm.translation() = Vec3f(0.4 * i, 0, 0);
				tm.scale() = Vec3f(1.0 + 0.1*i, 1.0 - 0.1*i, 1.0);
				tm.rotation() = Quat<float>(i * (-0.2), Vec3f(1, 0, 0)).toMatrix3x3();
				hTransform.pushBack(tm);
			}

			this->stateTransforms()->allocate()->assign(hTransform);

			std::shared_ptr<TriangleSet<DataType3f>> triSet = std::make_shared<TriangleSet<DataType3f>>();
			triSet->loadObjFile(getAssetPath() + "armadillo/armadillo.obj");

			this->stateTopology()->setDataPtr(triSet);

			hTransform.clear();
		};

		DEF_ARRAY_STATE(Transform3f, Transforms, DeviceType::GPU, "Instance transform");

		DEF_INSTANCE_STATE(TopologyModule, Topology, "Topology");
	};
  • 创建鼠标交互相应节点:
   //Create a CustomMouseInteraction object to handle the mouse event,
	//Press/release the mouse button to show the information
	auto mouseInterator = std::make_shared<CustomMouseInteraction>();
	instanceNode->stateTopology()->connect(mouseInterator->inTopology());
	instanceNode->graphicsPipeline()->pushModule(mouseInterator);
  • 创建渲染节点及边界:
	auto instanceRender = std::make_shared<GLInstanceVisualModule>();
	instanceRender->setColor(Vec3f(0, 1, 0));
	instanceNode->stateTopology()->connect(instanceRender->inTriangleSet());
	instanceNode->stateTransforms()->connect(instanceRender->inTransform());
	instanceNode->graphicsPipeline()->pushModule(instanceRender);

	scn->setUpperBound({ 4, 4, 4 });

3、仿真效果

如图所示,当鼠标在仿真界面移动、点击时,程序会打印出相应的状态、位置坐标等信息。代码参考example/GL_MouseInteractionInGraphicsPipeline/main.h: