QT3D QML用户输入

Qt3d qml user input

本文关键字:输入 用户 QML QT3D      更新时间:2023-10-16

我是QT3D的新手,我需要使用多个模型在场景上处理用户输入。特别是我需要使用用户单击的模型找到。我尝试使用MouseHandler和Objectpicker,但似乎无法使用。有人有例子吗?

例如,如果我有:

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,我将看不到任何日志!

  • 您需要创建一个对象点并将其作为组件将其附加到每个实体。您可以删除MouseHandler的内容。
Entity {
  id: sphere2
  components: [sphereMesh, material, spherePicker]      
}
ObjectPicker{
  id: spherePicker
  onPressed:{
     console.log("Sphere clicked")
  }
}
  • 请注意,默认情况下,这将进行边界框射线播放,因此您很有可能单击网格附近的某个地方,但并非完全在其上,并且会单击一次。如果您想进行三角挑选,则可以通过更改根源的选择组件来指定这一点,如果这是您的问题,这将解决此问题。我假设这会比边界盒射线播放要慢得多,但是使用大的100 MB .STL文件,我没有注意到任何可见的放缓。
 components: [
   RenderSettings{
   activeFrameGraph:ForwardRenderer {
      camera: camera
      clearColor: "transparent"
   },
   InputSettings{}
   pickingSettings.pickMethod: PickingSettings.TrianglePicking
   pickingSettings.faceOrientationPickingMode: PickingSettings.FrontAndBackFace 
   ]
  • 如果您想知道在世界空间中的位置按下对象,那么大多数对象点方法都有一个可以查看的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)
       }
    }
  • 要注意的另一件事要注意:您会看到,对于对象点击,我正在使用on plasted而不是被关闭。对于大型网格(例如90MB .STL文件),onclicked是无法预测的。我会单击网格,有时会发射,有时不会。但是,态度总是会开火。这是我对QT 5.8和QT 5.9的观察。

相关文档在这里