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