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