Глава 61 – 3D-графика Qt 3D

Эта глава раскроет тему 3D в Qt, при котором сложные сцены перестают быть проблемой. Здесь обнаружите, как архитектура Qt 3D позволяет мыслить не мешами и координатами, а поведением, светом и взаимодействием. Будет показано, как профессиональные разработчики добиваются визуальной глубины.

Будут задействованы система сущностей и компонентов (ECS), три типа источников света, несколько видов камер и минимум 5 ключевых трансформаций, которые меняют восприятие сцены. Показано, как анимация в 3D может быть реализована без игровых движков — средствами, которые уже есть в Qt.

Пропустить эту главу — значит остаться на уровне «статичных моделей», тогда как здесь начинается настоящее пространственное мышление в Qt.

В этой главе вы найдёте готовые к использованию примеры кода.

Самопроверка по главе

Почему система компонентов сущностей (ECS) была заимствована в Qt 3D из игровых движков?Ответ
Правильный ответ: Основное преимущество ECS — гибкость изменения поведения сущностей в режиме реального времени путем добавления или удаления компонентов без прерывания работы программы.
Почему сущность (Entity) сама по себе не несет поведения и характеристик?Ответ
Правильный ответ: Сущности — это контейнеры для компонентов. Поведение добавляется путем объединения компонентов (геометрия, материал, трансформация), что обеспечивает модульность и гибкость архитектуры.
Какой тип света следует использовать для имитации освещения от Солнца и почему?Ответ
Правильный ответ: Направленный свет (DirectionalLight), так как он излучает лучи с бесконечного расстояния и освещает все объекты сцены одинаково, независимо от их расположения, что соответствует природе солнечного света.
Почему не рекомендуется использовать чисто белый цвет для дневного освещения?Ответ
Правильный ответ: Для большей реалистичности следует добавлять оттенки (например, желтоватый), так как в реальном мире дневной свет не является абсолютно белым.
Зачем камерам в Qt 3D можно изменять положение и анимировать его?Ответ
Правильный ответ: Это позволяет создавать эффекты движения внутри или вдоль объектов (здания, туннели), показывать сцену под разными углами и создавать кинематографические эффекты.
Для чего в формате OBJ используются нормальные векторы (vn)?Ответ
Правильный ответ: Нормали перпендикулярны к лицевым поверхностям и необходимы для правильного расчета освещения, теней и отражений на 3D-объектах.
В чем ключевое отличие PhongMaterial от GoochMaterial с точки зрения производительности?Ответ
Правильный ответ: GoochMaterial отображается быстрее, так как не создает сглаживание и блики, поэтому отлично подходит для тестовых визуализаций, в то время как PhongMaterial создает более реалистичные блестящие поверхности.
Что произойдет, если не установить cameraAspectRatioMode в значение Scene3D.AutomaticAspectRatio?Ответ
Правильный ответ: При изменении размеров окна объекты сцены будут искажаться, так как пропорции отображения не будут автоматически подстраиваться под новые размеры окна.
Почему стандартные 3D-объекты Qt 3D можно использовать как «строительный материал»?Ответ
Правильный ответ: Из простых форм (сферы, цилиндры, конусы) можно составлять сложные объекты с помощью трансформаций, как показано на примере снеговика из пяти сфер, двух цилиндров и конуса.
Какую проблему решает последовательность вызовов rotate() и translate() в трансформационной матрице?Ответ
Правильный ответ: Сначала rotate() поворачивает объект, затем translate() смещает его, что позволяет создать эффект вращения объекта на удалении от центра (орбитальное движение).
Зачем в свойстве aspects элемента Scene3D указывать значения “input” и “logic”?Ответ
Правильный ответ: Это необходимо, чтобы сцена могла получать и интерпретировать пользовательский ввод (клавиатура, мышь, тачпад) для управления камерой и взаимодействия со сценой.
Почему для отображения 3D-объекта недостаточно только геометрии (Mesh)?Ответ
Правильный ответ: Геометрия определяет только форму объекта, но не его визуальное отображение. Для отображения необходим материал, который создает поверхность и определяет, как она отражает свет.
Какое преимущество дает новый материал PrincipledMaterial в Qt6?Ответ
Правильный ответ: Он основан на физически-корректном рендеринге (PBR) и обеспечивает более реалистичное отображение с параметрами шероховатости, металличности и нормалей.
Как можно создать цилиндр, используя элемент ConeMesh?Ответ
Правильный ответ: Нужно присвоить свойствам topRadius и bottomRadius одинаковые значения, что превратит конус в цилиндр с равными основаниями.
Почему для анимации в 3D можно использовать элементы, применявшиеся для 2D-анимации?Ответ
Правильный ответ: Элементы вроде NumberAnimation изменяют свойства объектов во времени, что универсально для любого типа графики — будь то изменение позиции, угла поворота или масштаба в 2D или 3D.

Практические задания

Простой уровень

Интерактивная галерея геометрических фигур
Создайте 3D-сцену с тремя разными геометрическими объектами (сфера, куб, тор), расположенными на одной горизонтальной линии. Каждый объект должен иметь свой уникальный цвет материала. Добавьте точечный источник света и настройте управление камерой для осмотра сцены.
Подсказки: Используйте SphereMesh, CuboidMesh и TorusMesh. Для расположения объектов по линии примените Transform с разными значениями translation по оси X. Назначьте каждому объекту PhongMaterial с уникальным цветом diffuse. Не забудьте FirstPersonCameraController для управления камерой.

Средний уровень

Анимированная солнечная система
Создайте упрощенную модель солнечной системы: центральное «Солнце» (большая сфера с ярким материалом) и две «планеты» (меньшие сферы), вращающиеся вокруг него на разных орбитах и с разной скоростью. Используйте направленный свет для имитации солнечного освещения. Добавьте вращение планет вокруг собственной оси.
Подсказки: Для орбитального движения используйте Transform с трансформационной матрицей: сначала rotate() для угла орбиты, затем translate() для удаления от центра. Примените NumberAnimation к свойству, управляющему углом. Для вращения вокруг оси создайте отдельную анимацию rotationY. Установите разные значения duration для разных скоростей.

Сложный уровень

3D-сцена с множественным освещением и композитным объектом
Создайте сложную композицию из стандартных 3D-объектов (например, робота или архитектурную конструкцию) с использованием как минимум 6 разных геометрических форм. Реализуйте систему освещения из трех источников разных типов (точечный, направленный, прожекторный) с разными цветами. Добавьте анимацию для двух компонентов композиции и анимированное движение прожектора, который «следит» за одним из движущихся элементов.
Подсказки: Группируйте связанные объекты в отдельные Entity для удобства. Используйте трансформации для точного позиционирования каждой части композиции. Для прожектора (SpotLight) анимируйте свойства Transform, синхронизируя их с движением целевого объекта. Экспериментируйте со свойствами intensity и color источников света для создания драматического эффекта. Используйте разные материалы (PhongMaterial, GoochMaterial) для контраста.

💬 Присоединяйтесь к обсуждению!

Разобрались с системой компонентов сущностей? Экспериментировали с различными типами освещения и материалов?

Поделитесь своими 3D-творениями, расскажите о трудностях при работе с трансформациями или помогите другим читателям освоить Qt 3D! Ваш опыт создания анимированных сцен может быть очень полезен сообществу.

Обсудите: Какие типы проектов вы планируете создавать с Qt 3D? Возникли вопросы о производительности рендеринга или оптимизации сцен?

Leave a Reply

Your email address will not be published. Required fields are marked *