Overview
With Qt5.7 the Qt3D module is now a part of the Qt library, and it is a fully functional scene graph module. This post will provide a minimal example window and a scene graph (torus) by using CMake instead of QMake.
Note: the below example requires Qt5.7 version as a minimum Qt version.
CMAkeLists.txt
file
cmake_minimum_required ( VERSION 2.8.11)
project ( qt3DExample)
set ( CMAKE_INCLUDE_CURRENT_DIR ON)
set ( CMAKE_AUTOMOC ON)
# include necessary qt3d modules
find_package ( Qt5 REQUIRED COMPONENTS Core Gui Widgets 3DCore 3DExtras 3DRender 3DInput)
set ( SOURCES
main.cpp
)
add_executable ( ${ PROJECT_NAME } ${ SOURCES } )
# link the qt3d libraries
target_link_libraries ( ${ PROJECT_NAME }
Qt5::Core
Qt5::Gui
Qt5::Widgets
Qt5::3DCore
Qt5::3DExtras
Qt5::3DRender
Qt5::3DInput
)
main.cpp
file
As a scene graph, we will place a single torus on the scene and will use some basic scene graph componenets connected to it: transform, material, geometry type. This example is a simplified version of the Qt 3D: Simple C++ Example .
#include <QGuiApplication>
#include <Qt3DCore/QEntity>
#include <Qt3DCore/QTransform>
#include <Qt3DCore/QAspectEngine>
#include <Qt3DRender/qrenderaspect.h>
#include <Qt3DRender/QCamera>
#include <Qt3DRender/QMaterial>
#include <Qt3DExtras/Qt3DWindow>
#include <Qt3DExtras/QTorusMesh>
#include <Qt3DExtras/QOrbitCameraController>
#include <Qt3DExtras/QPhongMaterial>
Qt3DCore :: QEntity * createTestScene ()
{
Qt3DCore :: QEntity * root = new Qt3DCore :: QEntity ;
Qt3DCore :: QEntity * torus = new Qt3DCore :: QEntity ( root );
Qt3DExtras :: QTorusMesh * mesh = new Qt3DExtras :: QTorusMesh ;
mesh -> setRadius ( 5 );
mesh -> setMinorRadius ( 1 );
mesh -> setRings ( 100 );
mesh -> setSlices ( 20 );
Qt3DCore :: QTransform * transform = new Qt3DCore :: QTransform ;
// transform->setScale3D(QVector3D(1.5, 1, 0.5));
transform -> setRotation ( QQuaternion :: fromAxisAndAngle ( QVector3D ( 1 , 0 , 0 ), 45. f ));
Qt3DRender :: QMaterial * material = new Qt3DExtras :: QPhongMaterial ( root );
torus -> addComponent ( mesh );
torus -> addComponent ( transform );
torus -> addComponent ( material );
return root ;
}
int main ( int argc , char * argv [])
{
QGuiApplication app ( argc , argv );
Qt3DExtras :: Qt3DWindow view ;
Qt3DCore :: QEntity * scene = createTestScene ();
// camera
Qt3DRender :: QCamera * camera = view . camera ();
camera -> lens () -> setPerspectiveProjection ( 45.0 f , 16.0 f / 9.0 f , 0.1 f , 1000.0 f );
camera -> setPosition ( QVector3D ( 0 , 0 , 40.0 f ));
camera -> setViewCenter ( QVector3D ( 0 , 0 , 0 ));
// manipulator
Qt3DExtras :: QOrbitCameraController * manipulator = new Qt3DExtras :: QOrbitCameraController ( scene );
manipulator -> setLinearSpeed ( 50. f );
manipulator -> setLookSpeed ( 180. f );
manipulator -> setCamera ( camera );
view . setRootEntity ( scene );
view . show ();
return app . exec ();
}
Example screenshot