Qt 3D: Simple C++ Example▲
Simple demonstrates how to render a scene in Qt 3D.
Running the Example▲
To run the example from Qt Creator, open the Welcome mode and select the example from Examples. For more information, visit Building and Running an Example.
Setting Up the Scene▲
We set up the scene in the main.cpp file.
To be able to use the classes and functions in the Q3D Core, Q3D Render, Qt 3D Input, and Qt 3D Extras modules, we must include the classes:
#include <Qt3DCore/QEntity>
#include <Qt3DRender/QCamera>
#include <Qt3DRender/QCameraLens>
#include <Qt3DCore/QTransform>
#include <Qt3DCore/QAspectEngine>
#include <Qt3DInput/QInputAspect>
#include <Qt3DRender/QRenderAspect>
#include <Qt3DRender/QGeometryRenderer>
#include <Qt3DExtras/QForwardRenderer>
#include <Qt3DExtras/QPhongMaterial>
#include <Qt3DExtras/QSphereMesh>
#include <Qt3DExtras/QTorusMesh>
First, we set up the scene and specify its root entity:
Qt3DCore::
QEntity *
createScene()
{
Qt3DCore::
QEntity *
rootEntity =
new
Qt3DCore::
QEntity;
We specify the material to use for Phong rendering:
Qt3DRender::
QMaterial *
material =
new
Qt3DExtras::
QPhongMaterial(rootEntity);
The root entity is just an empty shell and its behavior is defined by the components that it references. We specify the torus entity and its mesh, transform, and material components:
Qt3DCore::
QEntity *
torusEntity =
new
Qt3DCore::
QEntity(rootEntity);
Qt3DExtras::
QTorusMesh *
torusMesh =
new
Qt3DExtras::
QTorusMesh;
torusMesh-&
gt;setRadius(5
);
torusMesh-&
gt;setMinorRadius(1
);
torusMesh-&
gt;setRings(100
);
torusMesh-&
gt;setSlices(20
);
Qt3DCore::
QTransform *
torusTransform =
new
Qt3DCore::
QTransform;
torusTransform-&
gt;setScale3D(QVector3D(1.5
, 1
, 0.5
));
torusTransform-&
gt;setRotation(QQuaternion::
fromAxisAndAngle(QVector3D(1
, 0
, 0
), 45.0
f));
torusEntity-&
gt;addComponent(torusMesh);
torusEntity-&
gt;addComponent(torusTransform);
torusEntity-&
gt;addComponent(material);
We also specify a sphere entity and its components:
Qt3DCore::
QEntity *
sphereEntity =
new
Qt3DCore::
QEntity(rootEntity);
Qt3DExtras::
QSphereMesh *
sphereMesh =
new
Qt3DExtras::
QSphereMesh;
sphereMesh-&
gt;setRadius(3
);
sphereMesh-&
gt;setGenerateTangents(true
);
Qt3DCore::
QTransform *
sphereTransform =
new
Qt3DCore::
QTransform;
OrbitTransformController *
controller =
new
OrbitTransformController(sphereTransform);
controller-&
gt;setTarget(sphereTransform);
controller-&
gt;setRadius(20.0
f);
QPropertyAnimation *
sphereRotateTransformAnimation =
new
QPropertyAnimation(sphereTransform);
sphereRotateTransformAnimation-&
gt;setTargetObject(controller);
sphereRotateTransformAnimation-&
gt;setPropertyName("angle"
);
sphereRotateTransformAnimation-&
gt;setStartValue(QVariant::
fromValue(0
));
sphereRotateTransformAnimation-&
gt;setEndValue(QVariant::
fromValue(360
));
sphereRotateTransformAnimation-&
gt;setDuration(10000
);
sphereRotateTransformAnimation-&
gt;setLoopCount(-
1
);
sphereRotateTransformAnimation-&
gt;start();
sphereEntity-&
gt;addComponent(sphereMesh);
sphereEntity-&
gt;addComponent(sphereTransform);
sphereEntity-&
gt;addComponent(material);
We use a property animation to animate the sphere transform.
Finally, we initialize a Qt GUI application that uses a Qt 3D window:
int
main(int
argc, char
*
argv[])
{
QGuiApplication app(argc, argv);
Qt3DExtras::
Qt3DWindow view;
Qt3DCore::
QEntity *
scene =
createScene();
// Camera
Qt3DRender::
QCamera *
camera =
view.camera();
camera-&
gt;lens()-&
gt;setPerspectiveProjection(45.0
f, 16.0
f/
9.0
f, 0.1
f, 1000.0
f);
camera-&
gt;setPosition(QVector3D(0
, 0
, 40.0
f));
camera-&
gt;setViewCenter(QVector3D(0
, 0
, 0
));
// For camera controls
Qt3DExtras::
QOrbitCameraController *
camController =
new
Qt3DExtras::
QOrbitCameraController(scene);
camController-&
gt;setLinearSpeed( 50.0
f );
camController-&
gt;setLookSpeed( 180.0
f );
camController-&
gt;setCamera(camera);
view.setRootEntity(scene);
view.show();
return
app.exec();
}