2016-11-28 17 views
2

私はqt3dが新しく、複数のモデルでシーンのユーザー入力を処理する必要があります。 特に、私はユーザーがクリックしたモデルを見つける必要があります。 mouseHandlerとObjectPickerを試してみましたが、うまくいかないようです。誰かが例を持っていますか?例についてはQt3d qmlユーザー入力

は私が持っている場合:

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

いくつかのコードを提供できますか?あなたは何をモデルと呼んでいますか?たぶん[MouseArea](http://doc.qt.io/qt-5/qml-qtquick-mousearea.html)はあなたを助けることができます – user2436719

+0

私の投稿を編集! –

+0

私はこれも初めてですが、あなたはあなたのエンティティのコンポーネントとして 'ObjectPicker'を置く必要があると思います。 – Matt

答えて

1

ObjectPickerを作成し、それをコンポーネントとして各エンティティに追加する必要があります。 MouseHandlerの内容を削除することができます。

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

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

デフォルトでは、このボックスのレイキャスティングをバウンディングんだろう、あなたがどこかにメッシュ近いクリックではなく、まさにそれを、そしてそれはクリックを登録することが非常に可能性があることに注意してください。三角形のピッキングを行いたい場合は、rootEntityのpickingSettingsコンポーネントを変更することで指定することができます。これは、これが問題であればこれを解決します。私はこれが箱入りのレイキャスティングよりもはるかに遅いと仮定していますが、大きな100Mbの.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) 
    } 
} 

もう1つの注意点:ObjectPickerの場合、onClickedではなくonPressedを使用しています。大きなメッシュの場合(例えば、90MBの.stlファイル)、onClickedは予測できませんでした。私はメッシュをクリックし、時にはそれが発火し、時にはそうではない。しかしonPressedはいつも発砲するでしょう。これはQt 5.8とQt 5.9での私の観察でした。

関連するドキュメントはhere