首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Qt3d qml用户输入

Qt3d qml用户输入
EN

Stack Overflow用户
提问于 2016-11-28 15:30:47
回答 1查看 1.4K关注 0票数 4

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

例如,如果我有:

代码语言:javascript
运行
复制
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,但如果我单击球体,我就看不到任何日志!

EN

回答 1

Stack Overflow用户

发布于 2017-06-15 19:39:55

  • 您需要创建一个ObjectPicker并将其作为组件附加到每个实体。您可以删除MouseHandler内容。
代码语言:javascript
运行
复制
Entity {
  id: sphere2
  components: [sphereMesh, material, spherePicker]      
}

ObjectPicker{
  id: spherePicker
  onPressed:{
     console.log("Sphere clicked")
  }
}
  • 请注意,默认情况下,这将执行包围框光线投射,因此您很有可能单击网格附近的某个位置,但不完全在网格上单击,并且它将注册单击。如果您想要进行三角选择,可以通过更改rootEntity的pickingSettings组件来指定这一点,如果这对您来说是个问题,这将解决这个问题。我假设这将比包围框射线投射慢得多,但是对于大的100 mb的.stl文件,我没有注意到任何明显的减速。
代码语言:javascript
运行
复制
 components: [
   RenderSettings{
   activeFrameGraph:ForwardRenderer {
      camera: camera
      clearColor: "transparent"
   },
   InputSettings{}
   pickingSettings.pickMethod: PickingSettings.TrianglePicking
   pickingSettings.faceOrientationPickingMode: PickingSettings.FrontAndBackFace 
   ]
  • 如果您想知道在worldspace中对象被按下的位置,那么大多数ObjectPicker方法都有一个可以查看的PickEvent。
代码语言:javascript
运行
复制
    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。对于大型网格(比如90 was的.stl文件),onClicked是不可预测的。我会点击网格,有时会触发,有时不会,但onPressed总是会触发。这是我对Qt 5.8和Qt 5.9的观察。

相关文档为这里

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40847974

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档