【问题标题】:why FirstPersonCameraController {camera: camera } not working with QML ApplicationWindow?为什么 FirstPersonCameraController {camera: camera } 不能与 QML ApplicationWindow 一起使用?
【发布时间】:2019-12-03 14:10:56
【问题描述】:

我正在 ApplicationWindow 中从 PyQT5 加载 QML 3D 场景。 但是,我无法用鼠标平移和旋转我的自定义模型。

import QtQuick.Controls 2.5
import QtQuick.Scene3D 2.12

import Qt3D.Core 2.12
import Qt3D.Render 2.12
import Qt3D.Input 2.12
import Qt3D.Extras 2.13

import QtQuick 2.12 as QQ2

ApplicationWindow{   

    Scene3D {
            id: scene3d
            anchors.fill: parent
            anchors.margins: 10
            focus: true
            aspects: "input"

            FirstPersonCameraController {
                            camera: camera
                            }

            Entity {
                id: sceneRoot


                Camera {
                    id: camera
                    projectionType: CameraLens.PerspectiveProjection
                    fieldOfView: 45
                    nearPlane : 0.1
                    farPlane : 1000.0
                    position: Qt.vector3d( 0.0, 0.0, 40.0 )
                    upVector: Qt.vector3d( 0.0, 1.0, 1.0 )
                    viewCenter: Qt.vector3d( 0.0, 0.0, 0.0 )


                    PointLight{
                        id:pl3

                        }
                }



                ObjectPicker{
                  id: spherePicker
                  onPressed:{
                     console.log("Sphere clicked")
                  }
            }
                components: [
                    RenderSettings {
                        activeFrameGraph: ForwardRenderer {
                            camera: camera
                            clearColor: "transparent"
                        }
                    },
                    InputSettings { }
                ]

                PhongMaterial {
                    id: material
                    diffuse:Qt.rgba(0.5,0.5,0,1)
                }



                 PointLight{
                    id:pl2

                    }

               Mesh {
                    id: esh
                    source: "egg1.obj"

                    }

                Transform {
                    id: torusTransform
                    scale3D: Qt.vector3d(5, 5, 5)
                    rotation: fromAxisAndAngle(Qt.vector3d(1, 1, 0), 45)
                }

                Entity {
                    id: torusEntity
                    components: [ esh, material, torusTransform,spherePicker ]
                }

            }
        }


}

模型加载正确,只是我无法用鼠标控制它的旋转。

我认为这与“FirstPersonCameraController”有关

【问题讨论】:

    标签: python pyqt qml pyqt5 qt3d


    【解决方案1】:

    我目前无法亲自验证这一点,但我假设您必须将您的 FirstPersonCameraController 移动到名为 sceneRoot 的根实体中。

    现在它是Scene3D 的子代。尝试将其移至Camera 节点下方,看看是否可行。

    顺便说一句:我假设您的意思是您无法控制相机,这就是您所说的

    模型加载正确,只是我无法用鼠标控制它的旋转。

    【讨论】:

      【解决方案2】:

      这是我目前用来从其位置旋转和平移对象的工作。 `

      Scene3D
      {
      id:myScene3d
      
      property int rotX:0
      property int rotY:0
      property int rotZ:0`
      
      Entity
      {
      
          id: sceneRoot
      
      
          Camera
          {
              id: camera
              projectionType: CameraLens.PerspectiveProjection
              fieldOfView: 2
              aspectRatio: 16/9
              nearPlane : 0.1
              farPlane : 20.0
              position: Qt.vector3d(posX,posY,posZ)
              upVector: Qt.vector3d( 0.0, 1.0, 0.0 )
              viewCenter: Qt.vector3d( 0.0, 0.0, 0.0 )                                  
          }
      
          FirstPersonCameraController
          {
              camera: camera
              linearSpeed: 1.0
              acceleration: 0.1
              deceleration: 1.0
          }
      
      
              Entity
          {
              id: monkeyEntity
              components: [
                  SceneLoader
                  {
                      id: sceneLoader
                  },
                  Transform
                  {
      
                      rotationX  :   rotX
                      rotationY  :   rotY
                      rotationZ  :   rotZ
                  },
      
                  ObjectPicker
                  {
                      onPressed: {
                          console.log("Object clicked! Pressed at world-intersection: ", pick.worldIntersection)
                          console.log("Triangle index: ", pick.triangleIndex)
                      }
                  }
      
              ]
      

      如您所见,rotX、rotY 和 rotZ 用作场景外部的属性。 然后我只是在 MouseX 和 MouseY 值上使用了 case 语句。我希望你明白了。 }

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-09-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-10-30
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多