Qt3D Animation C++
-
Hello everyone, I have recently started playing with the Qt Framework 3D Module.
I however was unable to find any good example for animation in C++ most of them being in QML.
I am trying to apply an animation I imported from blender( simple cube translation) using the Qt3d animation exporter blender plugin. I however don't know how to handle it. I tried using a QAnimationClipLoader and a QClipAnimator but to be honest I am going basically blind in this.
Can anyone help me ? Just in case I added the code I used.#include <QApplication> #include <QWidget> #include <QPushButton> #include <QBoxLayout> #include <Qt3DCore> #include <Qt3DRender> #include <Qt3DExtras> #include <Qt3DAnimation> int main(int argc, char *argv[]) { QApplication a(argc, argv); //Container window and 3d view Qt3DExtras::Qt3DWindow *view = new Qt3DExtras::Qt3DWindow(); view->defaultFrameGraph()->setClearColor(QColor(QRgb(0x4d4d4f))); QWidget *container = QWidget::createWindowContainer(view); QSize screenSize = view->screen()->size(); container->setMinimumSize(QSize(200, 100)); container->setMaximumSize(screenSize); //Main widget QWidget *widget = new QWidget; QHBoxLayout *hLayout = new QHBoxLayout(widget); QVBoxLayout *vLayout = new QVBoxLayout(); vLayout->setAlignment(Qt::AlignTop); hLayout->addWidget(container, 1); hLayout->addLayout(vLayout); //To control input Qt3DInput::QInputAspect *input = new Qt3DInput::QInputAspect; view->registerAspect(input); // Root entity Qt3DCore::QEntity *rootEntity = new Qt3DCore::QEntity(); // Camera Qt3DRender::QCamera *cameraEntity = view->camera(); cameraEntity->lens()->setPerspectiveProjection(45.0f, 16.0f/9.0f, 0.1f, 1000.0f); cameraEntity->setPosition(QVector3D(0, 0, 20.0f)); cameraEntity->setUpVector(QVector3D(0, 1, 0)); cameraEntity->setViewCenter(QVector3D(0, 0, 0)); //Light Qt3DCore::QEntity *lightEntity = new Qt3DCore::QEntity(rootEntity); Qt3DRender::QPointLight *light = new Qt3DRender::QPointLight(lightEntity); light->setColor("white"); light->setIntensity(1); lightEntity->addComponent(light); Qt3DCore::QTransform *lightTransform = new Qt3DCore::QTransform(lightEntity); lightTransform->setTranslation(cameraEntity->position()); lightEntity->addComponent(lightTransform); //Load mesh Qt3DRender::QMesh *mesh = new Qt3DRender::QMesh(); mesh->setSource(QUrl::fromLocalFile("Data/Models/Wolf_One_obj.obj")); Qt3DCore::QTransform *meshTransform = new Qt3DCore::QTransform(); meshTransform->setScale(5.f); //meshTransform->setRotation(QQuaternion::fromAxisAndAngle(QVector3D(1.0f, 0.0f, 0.0f), 45.0f)); meshTransform->setTranslation(QVector3D(-5.0f, 4.0f, -1.5)); Qt3DExtras::QPhongMaterial *wolfMaterial = new Qt3DExtras::QPhongMaterial(); wolfMaterial->setDiffuse(QColor(QRgb(0xa69929))); Qt3DCore::QEntity *meshEntity = new Qt3DCore::QEntity(rootEntity); meshEntity->addComponent(mesh); meshEntity->addComponent(meshTransform); meshEntity->addComponent(wolfMaterial); // Sphere shape data Qt3DExtras::QSphereMesh *sphereMesh = new Qt3DExtras::QSphereMesh(); sphereMesh->setRings(20); sphereMesh->setSlices(20); sphereMesh->setRadius(2); // Sphere mesh transform Qt3DCore::QTransform *sphereTransform = new Qt3DCore::QTransform(); sphereTransform->setScale(1.3f); sphereTransform->setTranslation(QVector3D(-5.0f, -4.0f, 0.0f)); Qt3DExtras::QPhongMaterial *sphereMaterial = new Qt3DExtras::QPhongMaterial(); sphereMaterial->setDiffuse(QColor(QRgb(0xa69929))); //Animation Qt3DAnimation::QAnimationClipLoader* m_animationClipLoader = new Qt3DAnimation::QAnimationClipLoader(QUrl::fromLocalFile("Data/Animations/simplemove.json")); Qt3DAnimation::QClipAnimator *m_animator = new Qt3DAnimation::QClipAnimator; m_animator->setClip(m_animationClipLoader); m_animator->setLoopCount(3); m_animator->start(); // Sphere Qt3DCore::QEntity* m_sphereEntity = new Qt3DCore::QEntity(rootEntity); m_sphereEntity->addComponent(sphereMesh); m_sphereEntity->addComponent(sphereMaterial); m_sphereEntity->addComponent(sphereTransform); m_sphereEntity->addComponent(m_animator); // For camera controls Qt3DExtras::QFirstPersonCameraController *camController = new Qt3DExtras::QFirstPersonCameraController(rootEntity); camController->setCamera(cameraEntity); // Set root object of the scene view->setRootEntity(rootEntity); widget->show(); widget->resize(1200, 800); return a.exec(); }
-
Hi and welcome to devnet,
It's rather are more classic problem: the people developing the module are trying to provide as complete a documentation as possible but it also takes a lot of time to create meaningful examples and demos.
I'd recommend bringing this question to the interest mailing list. You'll find there Qt3D's developers/maintainers. This forum is more user oriented.
-
Chicken and egg. Not many users of the C++ Qt 3D API's yet, so not as much focus on documenting them first, so not many people can figure out how to use it, so there aren't many users, so C++ Qt3D documentation isn't the top priority, so...
-
@wrosecrans
Hoping I can get an answer from the mailing list. As soon as I figure it out I will post the solution here.