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