2016-11-28 3 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 항목을 삭제할 수 있습니다. 당신이 아니라 정확하게에 메쉬 가까운 곳을 클릭하고 클릭을 등록합니다 매우 수 있도록 기본적으로이 상자의 raycasting을 경계 할 것

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의 경우 onClicked 대신 onPressed가 사용됩니다. 큰 메쉬의 경우 (예 : 90MB .stl 파일) onClicked는 예측할 수 없었습니다. 메쉬를 클릭하면 가끔씩 불이 붙기도하고 때로는 불이 붙기도합니다. 그러나 onPressed는 항상 발화합니다. 이것은 Qt 5.8과 Qt 5.9에서의 관찰이었습니다.

관련 문서는 here