C++ Qt-3d-c++;动画

C++ Qt-3d-c++;动画,c++,qt,animation,3d,qt3d,C++,Qt,Animation,3d,Qt3d,我最近开始使用Qt Framework 3D模块。 然而,我不能找到任何好的例子,动画在C++中,他们大多是在QML。 我正在尝试使用Qt3d动画导出器blender插件应用从blender导入的动画(简单立方体翻译)。然而,我不知道如何处理它。我试着使用QAnimationClipLoader和QClipAnimator,但说实话,我在这方面基本上是瞎的。 有人能帮我吗?以防我添加了我使用的代码 #include <QApplication> #include <QWidge

我最近开始使用Qt Framework 3D模块。 然而,我不能找到任何好的例子,动画在C++中,他们大多是在QML。 我正在尝试使用Qt3d动画导出器blender插件应用从blender导入的动画(简单立方体翻译)。然而,我不知道如何处理它。我试着使用QAnimationClipLoader和QClipAnimator,但说实话,我在这方面基本上是瞎的。 有人能帮我吗?以防我添加了我使用的代码

#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();
}
根据的(shitty)Qt3D文档,您需要将
QChannelMapper
指定给
QClipAnimator
channelMapper
属性,该属性指定目标上要使用哪些动画关键帧制作动画的属性

您可以从以下方面获得想法:


也许还需要记住,如果您立即启动动画,动画将用尽循环。可能在显示三维视图后启动它。但这当然不是这里的主要问题。

我认为您应该在主要功能中注册动画方面:

{
    Qt3DExtras::Qt3DWindow *view = new Qt3DExtras::Qt3DWindow();
...
    view->registerAspect(new Qt3DAnimation::QAnimationAspect());
...
}
正确运行的代码:

    Qt3DCore::QEntity *createScene()
{
    // Root entity
    Qt3DCore::QEntity *rootEntity = new Qt3DCore::QEntity;

    //Load mesh

    Qt3DRender::QMesh *mesh = new Qt3DRender::QMesh(rootEntity);
    mesh->setSource(QUrl::fromLocalFile(":/res/egg/egg.obj"));

    Qt3DExtras::QPhongMaterial *wolfMaterial = new Qt3DExtras::QPhongMaterial(rootEntity);
    wolfMaterial->setDiffuse(QColor(QRgb(0xa69929)));

    Qt3DCore::QEntity *meshEntity = new Qt3DCore::QEntity(rootEntity);
    meshEntity->addComponent(mesh);
    meshEntity->addComponent(wolfMaterial);

    Qt3DCore::QTransform *meshTransform = new Qt3DCore::QTransform(rootEntity);

    //Animation
    auto *animator = new Qt3DAnimation::QClipAnimator(meshEntity);
    auto* clip = new Qt3DAnimation::QAnimationClipLoader(
                QUrl::fromLocalFile(":/res/jumpinganimation.json"), animator);

    animator->setClip( clip );


   Qt3DAnimation::QChannelMapping *m_mappingLocation = new Qt3DAnimation::QChannelMapping;
   m_mappingLocation->setChannelName("Location");
   m_mappingLocation->setTarget(meshTransform);
   m_mappingLocation->setProperty("translation");

   Qt3DAnimation::QChannelMapping *m_mappingRotation = new Qt3DAnimation::QChannelMapping;
   m_mappingRotation->setChannelName("Rotation");
   m_mappingRotation->setTarget(meshTransform);
   m_mappingRotation->setProperty("rotation");

   Qt3DAnimation::QChannelMapping *m_mappingScale = new Qt3DAnimation::QChannelMapping;
   m_mappingScale->setChannelName("Scale");
   m_mappingScale->setTarget(meshTransform);
   m_mappingScale->setProperty("scale3D");

   Qt3DAnimation::QChannelMapper *m_channelMapper = new Qt3DAnimation::QChannelMapper;
   m_channelMapper->addMapping(m_mappingLocation);
   m_channelMapper->addMapping(m_mappingRotation);
   m_channelMapper->addMapping(m_mappingScale);

   animator->setLoopCount(Qt3DAnimation::QAbstractClipAnimator::Infinite);
   animator->setChannelMapper(m_channelMapper);

   meshEntity->addComponent(meshTransform);
   animator->setRunning(true);
    return rootEntity;
}

int main(int argc, char* argv[])
{
    QGuiApplication app(argc, argv);
    Qt3DExtras::Qt3DWindow view;

    Qt3DCore::QEntity *scene = createScene();

    // Camera
    Qt3DRender::QCamera *camera = view.camera();
    camera->lens()->setPerspectiveProjection(45.0f, 16.0f/9.0f, 0.1f, 1000.0f);
    camera->setPosition(QVector3D(0, 0, 40.0f));
    camera->setViewCenter(QVector3D(0, 0, 0));

    // For camera controls
    Qt3DExtras::QOrbitCameraController *camController = new Qt3DExtras::QOrbitCameraController(scene);
    camController->setLinearSpeed( 50.0f );
    camController->setLookSpeed( 180.0f );
    camController->setCamera(camera);

    //point light 1
    Qt3DCore::QEntity *lightEntity = new Qt3DCore::QEntity(scene);
    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(camera->position());
    lightEntity->addComponent(lightTransform);


    //point light 2
    Qt3DCore::QEntity *lightEntity2 = new Qt3DCore::QEntity(scene);
    Qt3DRender::QPointLight *light2 = new Qt3DRender::QPointLight(lightEntity2);
    light2->setColor("yellow");
    light2->setIntensity(1);
    lightEntity2->addComponent(light2);
    Qt3DCore::QTransform *lightTransform2 = new Qt3DCore::QTransform(lightEntity2);
    lightTransform2->setTranslation(QVector3D(5.0f, 5.0f, -3.0f));
    lightEntity2->addComponent(lightTransform2);

    view.setRootEntity(scene);
    view.registerAspect(new Qt3DAnimation::QAnimationAspect());
    view.show();

    return app.exec();
}

我更改了代码并添加了在原始帖子中所做的更改。仍然不起作用,但从外观上看,默认情况下Qt3DWindow不添加QAnimationAspect。因此,也许可以尝试创建一个并在视图中注册它。除此之外,你可以尝试从这里简单的动画:检查动画是否工作。你知道如何访问一个网状骨架与C++和动画手动?
{
    Qt3DExtras::Qt3DWindow *view = new Qt3DExtras::Qt3DWindow();
...
    view->registerAspect(new Qt3DAnimation::QAnimationAspect());
...
}
    Qt3DCore::QEntity *createScene()
{
    // Root entity
    Qt3DCore::QEntity *rootEntity = new Qt3DCore::QEntity;

    //Load mesh

    Qt3DRender::QMesh *mesh = new Qt3DRender::QMesh(rootEntity);
    mesh->setSource(QUrl::fromLocalFile(":/res/egg/egg.obj"));

    Qt3DExtras::QPhongMaterial *wolfMaterial = new Qt3DExtras::QPhongMaterial(rootEntity);
    wolfMaterial->setDiffuse(QColor(QRgb(0xa69929)));

    Qt3DCore::QEntity *meshEntity = new Qt3DCore::QEntity(rootEntity);
    meshEntity->addComponent(mesh);
    meshEntity->addComponent(wolfMaterial);

    Qt3DCore::QTransform *meshTransform = new Qt3DCore::QTransform(rootEntity);

    //Animation
    auto *animator = new Qt3DAnimation::QClipAnimator(meshEntity);
    auto* clip = new Qt3DAnimation::QAnimationClipLoader(
                QUrl::fromLocalFile(":/res/jumpinganimation.json"), animator);

    animator->setClip( clip );


   Qt3DAnimation::QChannelMapping *m_mappingLocation = new Qt3DAnimation::QChannelMapping;
   m_mappingLocation->setChannelName("Location");
   m_mappingLocation->setTarget(meshTransform);
   m_mappingLocation->setProperty("translation");

   Qt3DAnimation::QChannelMapping *m_mappingRotation = new Qt3DAnimation::QChannelMapping;
   m_mappingRotation->setChannelName("Rotation");
   m_mappingRotation->setTarget(meshTransform);
   m_mappingRotation->setProperty("rotation");

   Qt3DAnimation::QChannelMapping *m_mappingScale = new Qt3DAnimation::QChannelMapping;
   m_mappingScale->setChannelName("Scale");
   m_mappingScale->setTarget(meshTransform);
   m_mappingScale->setProperty("scale3D");

   Qt3DAnimation::QChannelMapper *m_channelMapper = new Qt3DAnimation::QChannelMapper;
   m_channelMapper->addMapping(m_mappingLocation);
   m_channelMapper->addMapping(m_mappingRotation);
   m_channelMapper->addMapping(m_mappingScale);

   animator->setLoopCount(Qt3DAnimation::QAbstractClipAnimator::Infinite);
   animator->setChannelMapper(m_channelMapper);

   meshEntity->addComponent(meshTransform);
   animator->setRunning(true);
    return rootEntity;
}

int main(int argc, char* argv[])
{
    QGuiApplication app(argc, argv);
    Qt3DExtras::Qt3DWindow view;

    Qt3DCore::QEntity *scene = createScene();

    // Camera
    Qt3DRender::QCamera *camera = view.camera();
    camera->lens()->setPerspectiveProjection(45.0f, 16.0f/9.0f, 0.1f, 1000.0f);
    camera->setPosition(QVector3D(0, 0, 40.0f));
    camera->setViewCenter(QVector3D(0, 0, 0));

    // For camera controls
    Qt3DExtras::QOrbitCameraController *camController = new Qt3DExtras::QOrbitCameraController(scene);
    camController->setLinearSpeed( 50.0f );
    camController->setLookSpeed( 180.0f );
    camController->setCamera(camera);

    //point light 1
    Qt3DCore::QEntity *lightEntity = new Qt3DCore::QEntity(scene);
    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(camera->position());
    lightEntity->addComponent(lightTransform);


    //point light 2
    Qt3DCore::QEntity *lightEntity2 = new Qt3DCore::QEntity(scene);
    Qt3DRender::QPointLight *light2 = new Qt3DRender::QPointLight(lightEntity2);
    light2->setColor("yellow");
    light2->setIntensity(1);
    lightEntity2->addComponent(light2);
    Qt3DCore::QTransform *lightTransform2 = new Qt3DCore::QTransform(lightEntity2);
    lightTransform2->setTranslation(QVector3D(5.0f, 5.0f, -3.0f));
    lightEntity2->addComponent(lightTransform2);

    view.setRootEntity(scene);
    view.registerAspect(new Qt3DAnimation::QAnimationAspect());
    view.show();

    return app.exec();
}