C++ Qt3d qml用户输入

C++ Qt3d qml用户输入,c++,qt,3d,qml,C++,Qt,3d,Qml,我是Qt3d新手,需要处理多个模型场景中的用户输入。 特别是我需要查找用户单击的模型。 我尝试使用鼠标手柄和对象选择器,但似乎不起作用。有人举个例子吗 例如,如果我有: Entity { Camera { id: camera ... } FirstPersonCameraController { camera: camera } components: [ RenderSettings{ activeFrameGraph: ForwardRenderer {

我是Qt3d新手,需要处理多个模型场景中的用户输入。 特别是我需要查找用户单击的模型。 我尝试使用鼠标手柄和对象选择器,但似乎不起作用。有人举个例子吗

例如,如果我有:

Entity {

 Camera { id: camera ... }

 FirstPersonCameraController {
  camera: camera
 }

 components: [
  RenderSettings{
    activeFrameGraph: ForwardRenderer {
      camera: camera
      clearColor: "transparent"
    },
    InputSettings{}    
  ]

 MouseDevice {
  id: mouse1
  sensitivity: 0.1
 }

 SphereMesh {
  id: sphereMesh
  radius: 3
 }

 PhongMaterial{
  id: material
 }

 Entity {
  id: sphere1
  components: [sphereMesh, material]
  MouseHandler {
   sourceDevice: mouse1
   onClicked: console.log("[sphere 1] clicked"
  }
 }

 Entity {
  id: sphere2
  components: [sphereMesh, material]
  MouseHandler {
    sourceDevice: mouse1
    onClicked: console.log("[sphere 2] clicked"
  }
 }
}
我需要区分用户是单击sphere1还是sphere2,但是如果我单击sphere,我看不到任何日志

  • 您需要创建一个ObjectPicker,并将其作为组件附加到每个实体。你可以删除鼠标手柄的内容
  • 请注意,默认情况下,这将执行边界框光线投射,因此很可能单击网格附近的某个位置,但不完全是在网格上,并且它将注册单击。如果要进行三角形拾取,可以通过更改rootEntity的pickingSettings组件来指定,如果这对您来说是一个问题,这将解决此问题。我假设这会比边界框光线投射慢很多,但是对于大的100 mb.stl文件,我没有注意到任何明显的减慢
  • 如果您想知道对象在世界空间的何处被按下,大多数ObjectPicker方法都有一个PickEvent,您可以查看它
  • 另一件需要注意的事情是:您将看到,对于ObjectPicker,我使用的是onPressed而不是onClicked。对于大网格(比如90mb.stl文件),onclick是不可预测的。我会点击网格,有时会开火,有时不会。但onPressed总是会开火。这是我对Qt 5.8和Qt 5.9的观察结果

相关文档是

您能提供一些代码吗?你把模型叫做什么?也许我可以帮你编辑我的帖子!我对此也不熟悉,但我认为您需要将
ObjectPicker
作为实体的一个组件。
Entity {
  id: sphere2
  components: [sphereMesh, material, spherePicker]      
}

ObjectPicker{
  id: spherePicker
  onPressed:{
     console.log("Sphere clicked")
  }
}
 components: [
   RenderSettings{
   activeFrameGraph:ForwardRenderer {
      camera: camera
      clearColor: "transparent"
   },
   InputSettings{}
   pickingSettings.pickMethod: PickingSettings.TrianglePicking
   pickingSettings.faceOrientationPickingMode: PickingSettings.FrontAndBackFace 
   ]
    ObjectPicker{
       onPressed:{
         console.log("Pressed at: " + pick.worldIntersection)
         //If using triangle picking, you can also see index of the pressed triangle
         console.log("Triangle index: " + pick.triangleIndex)
       }
    }