Я недавно начал играть с 3D модулем Qt Framework.
Однако я не смог найти ни одного хорошего примера анимации в C ++, большинство из которых были в QML.
Я пытаюсь применить анимацию, которую я импортировал из blender (простой перевод куба), используя плагин blender для экспортера анимации Qt3d. Я, однако, не знаю, как справиться с этим. Я пытался использовать 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();
}
Эй, я редактировал код приложения. Он все еще не работает, но я внес некоторые изменения, чтобы попытаться следовать документации.
#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;
m_animationClipLoader->setSource(QUrl::fromLocalFile("Data/Animations/simplemove.json"));
m_animationClipLoader->setEnabled(true);
Qt3DAnimation::QClipAnimator *m_animator = new Qt3DAnimation::QClipAnimator;
Qt3DAnimation::QChannelMapping *m_mapping = new Qt3DAnimation::QChannelMapping;
m_mapping->setChannelName("Location");
m_mapping->setTarget(sphereTransform);
m_mapping->setProperty("translation");
Qt3DAnimation::QChannelMapper *m_channelMapper = new Qt3DAnimation::QChannelMapper;
m_channelMapper->addMapping(m_mapping);
m_animator->setClip(m_animationClipLoader);
m_animator->setLoopCount(3);
m_animator->setChannelMapper(m_channelMapper);
//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);
//Qt3DRender::QObjectPicker *m_objectPicker = new Qt3DRender::QObjectPicker(rootEntity);
//m_objectPicker->connect(m_objectPicker, SIGNAL(pressedChanged(bool)), m_animator, SLOT(setRunning(bool)));
widget->show();
m_animator->setEnabled(true);
//m_animator->setRunning(true);
bool test = m_animator->isEnabled();
m_animator->start();
widget->resize(1200, 800);
return a.exec();
}
Я также добавляю сгенерированный код .json для справки
{
"animations": [
{
"animationName": "CubeAction",
"channels": [
{
"channelComponents": [
{
"channelComponentName": "Location X",
"keyFrames": [
{
"coords": [
0.0,
0.0
],
"leftHandle": [
-0.39041149616241455,
0.0
],
"rightHandle": [
0.39041149616241455,
0.0
]
},
{
"coords": [
1.0,
0.0
],
"leftHandle": [
0.6095885038375854,
0.0
],
"rightHandle": [
1.4066786766052246,
0.0
]
},
{
"coords": [
2.0416666666666665,
0.0
],
"leftHandle": [
1.6349879900614421,
0.0
],
"rightHandle": [
2.448345343271891,
0.0
]
}
]
},
{
"channelComponentName": "Location Z",
"keyFrames": [
{
"coords": [
0.0,
-7.051087379455566
],
"leftHandle": [
-0.39041149616241455,
-7.051087379455566
],
"rightHandle": [
0.39041149616241455,
-7.051087379455566
]
},
{
"coords": [
1.0,
-0.11975812911987305
],
"leftHandle": [
0.6095885038375854,
-2.7274463176727295
],
"rightHandle": [
1.4066786766052246,
2.596583843231201
]
},
{
"coords": [
2.0416666666666665,
6.575384140014648
],
"leftHandle": [
1.6349879900614421,
6.575384140014648
],
"rightHandle": [
2.448345343271891,
6.575384140014648
]
}
]
},
{
"channelComponentName": "Location Y",
"keyFrames": [
{
"coords": [
0.0,
0.0
],
"leftHandle": [
-0.39041149616241455,
0.0
],
"rightHandle": [
0.39041149616241455,
0.0
]
},
{
"coords": [
1.0,
3.835103988647461
],
"leftHandle": [
0.6095885038375854,
3.835103988647461
],
"rightHandle": [
1.4066786766052246,
3.835103988647461
]
},
{
"coords": [
2.0416666666666665,
-0.025578022003173828
],
"leftHandle": [
1.6349879900614421,
-0.025578022003173828
],
"rightHandle": [
2.448345343271891,
-0.025578022003173828
]
}
]
}
],
"channelName": "Location"
}
]
}
]
}