Базовый пример QML 3D

#qt #qml #qt5 #qt3d

#qt #qml #qt5 #qt3d

Вопрос:

Я пытаюсь создать базовое приложение QML, которое будет загружать 3D-модель из файла .obj и отображать ее на экране, а также иметь возможность поворачивать ее по осям во время выполнения. Я просмотрел некоторые примеры 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 и не понимаю, что еще нужно добавить в мой код.

Комментарии:

1. obj файлы не хранят данные, относящиеся к материалам или текстурам. Они хранят только геометрические данные. Ссылки на материалы для разных частей сетки определены в .mtl файлах. Вы должны предоставить .obj, .mtl и все ваши файлы текстур.

2. Текстуры (набор файлов png) уже присутствуют в том же пути к папке — images/robo-obj-pose4/textures . Нужно ли мне также добавлять этот путь где-нибудь в коде QML? Также я не вижу никаких файлов .mtl в моем случае. Это всего лишь obj и текстуры.

3. Я не уверен, загружает ли Qt3D материалы, предоставленные в mtl, автоматически. В любом случае, я думаю, вам следует предоставить файл mtl или определить пользовательские объекты material в вашем коде qml.

Ответ №1:

Вам не обязательно нужен файл материала, как предложено в комментариях, вы можете назначить общие материалы тем способом, которым вы это делаете, просто у вас есть некоторые другие проблемы с вашим кодом.

Сначала вам нужно добавить RenderSettings в качестве компонента к корневой сущности, вот так:

 Entity {
    id: sceneRoot

    components: [external_forward_renderer]

    ...
  

Во-вторых, "transparent" недопустимый чистый цвет. Используйте что-то вроде Qt.rgba(0, 0.5, 1, 1) .

В-третьих, вам нужно добавить file:// в начало URL-адреса сетки, если только у вас нет файла, включенного в файл ресурсов. По крайней мере, мне нужен был этот префикс, может быть, вам нет. Вы можете проверить это, взглянув на выходные данные приложения в QtCreator. Если он говорит «файл не существует», добавьте этот префикс.

Если вы все еще не видите свою сетку, попробуйте добавить InputSettings (которые также должны быть добавлены как компонент) и OrbitCameraController :

 InputSettings {
    id: inputSettings
}

OrbitCameraController{
    camera: camera
}
  

Комментарии:

1. Спасибо за ваш подробный ответ. Я внес изменения, как было предложено, но я по-прежнему получаю тот же результат — пустой белый экран. Вот как выглядит конечный код — pastebin.com/9aFtx9d6 (здесь используется pastebin из-за ограниченного количества символов) В боковой заметке я отображаю корневой объект внутри прямоугольника из main.qml — вот как это выглядит — pastebin.com/ySmZ1Bxg . Должно ли это быть проблемой?

2. Хорошо, отображение его изнутри прямоугольника, вероятно, является другой проблемой. Взгляните на 3D-сцену примера QML в QtCreator и посмотрите, как они это делают.

3. Ладно, похоже, мне не хватало элемента Scene3D, из-за которого теперь отображалась модель. Теперь я могу отобразить модель. Окончательный код выглядит следующим образом — pastebin.com/qKq18kVF Есть ли способ, которым я могу изменить размер этой модели во время отображения, чтобы она помещалась в ее родительском окне или что-то в этом роде? В настоящее время дисплей слишком мал. Я хотел бы динамически изменять его размер и иметь возможность поворачивать его вдоль своих осей.

4. Если мой ответ помог, вы можете принять его как решение. Я не уверен, что вы подразумеваете под вопросом в вашем комментарии. Но комментарии есть для того, чтобы люди могли попросить вас уточнить ваш вопрос и т.д. Так что, если у вас есть другой вопрос, задайте другой 🙂