我有一个项目,我有一个3d对象(.obj文件),我想点击这个对象。对于第一次测试,我很乐意改变对象的纹理或颜色。据我所知,它被称为采摘。你们知道如何在qt3d中管理这个吗?我的整个项目都是用qml编写的,所以如果我能用qml(没有c ++)进行选择会很棒,但是如果有必要我也可以这样尝试。
我的项目结构如下:
我有一个实体作为rootEntity和3D-Entity,我的网格被加载。此结构位于名为View3d.qml的自己的qml文件中。现在我在main.qml中设置了一个Scene3D并加载了一个View3d实例。
如果必要的话,我在Windows 8.1 64Bit系统上使用Qt 5.5 beta和qt3d。
答案 0 :(得分:1)
最简单的方法是使用 blender 将纹理添加到 .obj 文件中,然后将其添加到您的项目中。使用 Blender 执行此操作的方法有很多教程,请参阅此 How to Add Texture 和此 video。
以这段代码为例:
我有 2 个 qml 类
在 main.qml 中:
import QtQuick 2.12
import QtQuick.Window 2.12
import QtQuick.Scene3D 2.12
Window {
visible: true
width: 640
height: 480
title: qsTr("Hello World")
Scene3D
{
id : scene3d
anchors.fill: parent
focus: true
aspects: ["render", "logic", "input"]
hoverEnabled: true
cameraAspectRatioMode: Scene3D.AutomaticAspectRatio
antialiasing: true
RootEntity
{
id:root
}
}
}
在 RootEntity.qml 中:
import QtQuick 2.12
import Qt3D.Core 2.12
import Qt3D.Render 2.12
import Qt3D.Input 2.12
import Qt3D.Extras 2.12
Entity {
id: sceneRoot
readonly property var textureModel: [texture1, texture2, texture3, texture4]
readonly property Texture texture1: TextureLoader {
source: "qrc:/images/image.png"
}
readonly property Texture texture2: TextureLoader {
source: "qrc:/images/wood.jpg"
}
readonly property Texture texture3: Texture2D {
format: Texture.RGBA8_UNorm
textureImages: TextureImage {
source:"qrc:/images/image.png"
}
}
readonly property Texture texture4: Texture2D {
format: Texture.RGBA8_UNorm
textureImages: TextureImage {
source:"qrc:/images/wood.jpg"
}
}
Camera {
id: camera
projectionType: CameraLens.PerspectiveProjection
fieldOfView: 45
aspectRatio: 16/9
nearPlane : 0.1
farPlane : 1000.0
position: Qt.vector3d( 0.0, 20.0, -40.0 )
upVector: Qt.vector3d( 0.0, 1.0, 0.0 )
viewCenter: Qt.vector3d( 0.0, 0.0, 0.0 )
}
OrbitCameraController {
camera: camera
}
components: [
RenderSettings {
activeFrameGraph: ForwardRenderer {
clearColor: "#333339"
camera: camera
}
},
// Event Source will be set by the Qt3DQuickWindow
InputSettings { }
]
CuboidMesh { id: mesh }
NodeInstantiator {
id: instantiator
model: sceneRoot.textureModel
Entity {
readonly property Transform transform: Transform {
readonly property real angle: model.index / instantiator.count * Math.PI * 2
translation: Qt.vector3d(Math.cos(angle) * 10, 0, Math.sin(angle) * 10)
scale: 10
}
readonly property DiffuseMapMaterial material: DiffuseMapMaterial {
diffuse: model.modelData
ambient: "white"
}
components: [ mesh, material, transform ]
}
}
}
输出是:
答案 1 :(得分:-2)
参见demos / qt3d / teaservice。这显示了如何进行拾取(即使用鼠标选择对象)。请注意,您需要qt3d演示,而不是QML teaservice。