Qt3d qml用户输入

时间:2016-11-28 15:30:48

标签: c++ qt 3d qml

我是qt3d的新手,我需要在多个模型的场景中处理用户输入。 特别是我需要找到用户点击的模型。 我尝试使用mouseHandler和ObjectPicker,但它似乎不起作用。有人有一个例子吗?

例如,如果我有:

Entity {

 Camera { id:camera ... }

 FirstPersonCameraController {
  camera:camera
 }

 components: [
  RenderSetting{
    activeFrameGraph:ForwardRenderer {
      camera:camera
      clearColor:"transparent"
    },
    InputSetting{}    
  ]

 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,但如果我点击球体我看不到任何日志!

1 个答案:

答案 0 :(得分:3)

您需要创建一个ObjectPicker并将其作为组件附加到每个实体。你可以删除MouseHandler的东西。

Entity {
  id:sphere2
  components: [sphereMesh,material, spherePicker]      
}

ObjectPicker{
  id: spherePicker
  onPressed:{
     console.log("Sphere clicked")
  }
}

请注意,默认情况下,这将执行边界框光线投射,因此您很可能单击网格附近但不完全在其上,并且它将注册单击。如果要进行三角形拾取,可以通过更改rootEntity的pickingSettings组件来指定,如果这对您来说是个问题,可以解决这个问题。我假设这将比边界框光线投射慢得多,但是对于大的100 mb .stl文件,我没有注意到任何明显的减速。

components: [
  RenderSetting{
    activeFrameGraph:ForwardRenderer {
      camera:camera
      clearColor:"transparent"
    },
    InputSetting{}
    pickingSettings.pickMethod: PickingSettings.TrianglePicking
    pickingSettings.faceOrientationPickingMode: PickingSettings.FrontAndBackFace 
  ]

如果你想知道按下对象的世界空间在哪里,大多数ObjectPicker方法都有一个你可以看到的PickEvent。

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)
   }
}

需要注意的另一件事是:你会看到对于ObjectPicker,我使用onPressed而不是onClicked。对于大网格(比如90mb .stl文件),onClicked是不可预测的。我点击网格有时它会发射,有时它不会发射。但是onPressed总会开火。这是我对Qt 5.8和Qt 5.9的观察。

相关文档为here