From 424d707537f229340dab1ecc7d54db64cff4255f Mon Sep 17 00:00:00 2001 From: Konstantin Ritt Date: Mon, 16 Mar 2015 01:54:35 +0400 Subject: [Assimp scene loader] Fix loaded camera orientation There were several bugs in a single place: - aiCamera::GetCameraMatrix() produces a viewing matrix flipped around Y - additional QMatrix4x4::lookAt() transformation has been applied - and moreover, QMatrix4x4::lookAt(.., .., QVector3D(0, 0, 0)) produces an invalid matrix at all. Change-Id: Ie2a80810d76df0f0c39c3ae53adfdf52b06aafc1 Reviewed-by: Paul Lemire --- src/plugins/sceneparsers/assimp/assimpparser.cpp | 20 ++++++++------------ 1 file changed, 8 insertions(+), 12 deletions(-) (limited to 'src') diff --git a/src/plugins/sceneparsers/assimp/assimpparser.cpp b/src/plugins/sceneparsers/assimp/assimpparser.cpp index 5cbdc7b46..79610acee 100644 --- a/src/plugins/sceneparsers/assimp/assimpparser.cpp +++ b/src/plugins/sceneparsers/assimp/assimpparser.cpp @@ -38,6 +38,7 @@ #include #include +#include #include #include #include @@ -661,27 +662,22 @@ void AssimpParser::loadCamera(uint cameraIndex) QEntity *camera = new QEntity(); QCameraLens *lens = new QCameraLens(); - aiMatrix4x4 cm; - assimpCamera->GetCameraMatrix(cm); lens->setObjectName(QString::fromUtf8(assimpCamera->mName.data)); lens->setPerspectiveProjection(qRadiansToDegrees(assimpCamera->mHorizontalFOV), qMax(assimpCamera->mAspect, 1.0f), assimpCamera->mClipPlaneNear, assimpCamera->mClipPlaneFar); camera->addComponent(lens); - // View Matrix defines camera position & up vector relative to the associated - // node in the scene. This is computed in AssimpParser::node - // camera->lookAt()->setViewMatrix(); + QTransform *transform = new QTransform(); - QMatrix4x4 viewMatrix = AssimpParser::aiMatrix4x4ToQMatrix4x4(cm); - // CHECK THAT THIS WORKS - qCDebug(AssimpParserLog) << Q_FUNC_INFO << "IF CAMERA NOT BEHAVING CORRECTLY LOOK HERE"; - viewMatrix.lookAt(QVector3D(0, 0, 0), - QVector3D(assimpCamera->mLookAt.x, assimpCamera->mLookAt.y, assimpCamera->mLookAt.z), - QVector3D(0, 0, 0)); - transform->addTransform(new QMatrixTransform(viewMatrix)); + QLookAtTransform *lookAt = new QLookAtTransform(); + lookAt->setPosition(QVector3D(assimpCamera->mPosition.x, assimpCamera->mPosition.y, assimpCamera->mPosition.z)); + lookAt->setViewCenter(QVector3D(assimpCamera->mLookAt.x, assimpCamera->mLookAt.y, assimpCamera->mLookAt.z)); + lookAt->setUpVector(QVector3D(assimpCamera->mUp.x, assimpCamera->mUp.y, assimpCamera->mUp.z)); + transform->addTransform(lookAt); camera->addComponent(transform); + m_scene->m_cameras[cameraNode] = camera; } -- cgit v1.2.3