QML 3D 基本示例
QML 3D basic example
我正在尝试创建一个基本的 QML 应用程序,它将从 .obj 文件加载 3D 模型并将其显示在屏幕上,并能够在 运行 时间内沿其轴旋转它。我浏览了一些 Qt 示例并得出了以下代码——其中大部分是从工作示例中借用的。但是当我 运行 模型渲染不正确时。
实际模型是这样的:
目前我的应用显示为
.
这是QML代码-
import Qt3D.Core 2.12
import Qt3D.Render 2.12
import Qt3D.Extras 2.12
Entity {
id: sceneRoot
Camera {
id: camera
projectionType: CameraLens.PerspectiveProjection
fieldOfView: 45
aspectRatio: 1820 / 1080
nearPlane: 0.1
farPlane: 1000.0
position: Qt.vector3d(0.014, 0.956, 2.178)
upVector: Qt.vector3d(0.0, 1.0, 0.0)
viewCenter: Qt.vector3d(0.0, 0.7, 0.0)
}
Entity {
components: [
DirectionalLight {
intensity: 0.9
worldDirection: Qt.vector3d(0, 0.6, -1)
}
]
}
RenderSettings {
id: external_forward_renderer
activeFrameGraph: ForwardRenderer {
camera: camera
clearColor: "transparent"
}
}
Mesh {
id: roboMesh
source: "images/robo-obj-pose4/source/d2f0cff60afc40f5afe79156ec7db657.obj"
}
Entity {
id: circleEntity
property Material roboMaterial: PhongAlphaMaterial {
alpha: 0.4
ambient: "black"
diffuse: "black"
specular: "black"
shininess: 10000
}
components: [roboMesh, roboMaterial]
}
}
我在这里错过了什么?很抱歉提出一个非常愚蠢的问题,但我对 Qt3D 完全陌生,对我的代码中还需要什么感到困惑。
您不一定需要评论所建议的 material 文件,您可以按照自己的方式分配通用 materials,只是您的代码存在一些其他问题。
首先,您需要将 RenderSettings
作为组件添加到 root 实体中,如下所示:
Entity {
id: sceneRoot
components: [external_forward_renderer]
...
其次,"transparent"
不是有效的清晰颜色。使用类似 Qt.rgba(0, 0.5, 1, 1)
.
的内容
第三,您需要将 file://
添加到网格 URL 的开头,除非您将该文件包含在资源文件中。至少我需要那个前缀,也许你不需要。您可以通过查看 QtCreator 中的应用程序输出来检查这一点。如果显示 "file does not exist" 则添加此前缀。
如果您仍然看不到您的网格,请尝试添加 InputSettings
(也必须作为组件添加)和 OrbitCameraController
:
InputSettings {
id: inputSettings
}
OrbitCameraController{
camera: camera
}
我正在尝试创建一个基本的 QML 应用程序,它将从 .obj 文件加载 3D 模型并将其显示在屏幕上,并能够在 运行 时间内沿其轴旋转它。我浏览了一些 Qt 示例并得出了以下代码——其中大部分是从工作示例中借用的。但是当我 运行 模型渲染不正确时。
实际模型是这样的:
目前我的应用显示为
这是QML代码-
import Qt3D.Core 2.12
import Qt3D.Render 2.12
import Qt3D.Extras 2.12
Entity {
id: sceneRoot
Camera {
id: camera
projectionType: CameraLens.PerspectiveProjection
fieldOfView: 45
aspectRatio: 1820 / 1080
nearPlane: 0.1
farPlane: 1000.0
position: Qt.vector3d(0.014, 0.956, 2.178)
upVector: Qt.vector3d(0.0, 1.0, 0.0)
viewCenter: Qt.vector3d(0.0, 0.7, 0.0)
}
Entity {
components: [
DirectionalLight {
intensity: 0.9
worldDirection: Qt.vector3d(0, 0.6, -1)
}
]
}
RenderSettings {
id: external_forward_renderer
activeFrameGraph: ForwardRenderer {
camera: camera
clearColor: "transparent"
}
}
Mesh {
id: roboMesh
source: "images/robo-obj-pose4/source/d2f0cff60afc40f5afe79156ec7db657.obj"
}
Entity {
id: circleEntity
property Material roboMaterial: PhongAlphaMaterial {
alpha: 0.4
ambient: "black"
diffuse: "black"
specular: "black"
shininess: 10000
}
components: [roboMesh, roboMaterial]
}
}
我在这里错过了什么?很抱歉提出一个非常愚蠢的问题,但我对 Qt3D 完全陌生,对我的代码中还需要什么感到困惑。
您不一定需要评论所建议的 material 文件,您可以按照自己的方式分配通用 materials,只是您的代码存在一些其他问题。
首先,您需要将 RenderSettings
作为组件添加到 root 实体中,如下所示:
Entity {
id: sceneRoot
components: [external_forward_renderer]
...
其次,"transparent"
不是有效的清晰颜色。使用类似 Qt.rgba(0, 0.5, 1, 1)
.
第三,您需要将 file://
添加到网格 URL 的开头,除非您将该文件包含在资源文件中。至少我需要那个前缀,也许你不需要。您可以通过查看 QtCreator 中的应用程序输出来检查这一点。如果显示 "file does not exist" 则添加此前缀。
如果您仍然看不到您的网格,请尝试添加 InputSettings
(也必须作为组件添加)和 OrbitCameraController
:
InputSettings {
id: inputSettings
}
OrbitCameraController{
camera: camera
}