Ich versuche Billboarding in Qt 5.8 C++ zu implementieren. Ich möchte jedes Mal, wenn ich mich bewege, eine Einheit der Kamera gegenüberstellen. Ich habe eine Kamera, First Person Controls und eine Ebene Entity mit QTransform, QDiffuseMapMaterial und QPlaneMesh. Ich habe einige Versuche ohne die Matrix-Multiplikation gemacht, die ich in openGL-Tutorials gefunden habe, weil ich dachte, dass es eine einfachere Lösung in Qt3D geben könnte.Qt3d Billboarding
In der ersten Annäherung ist die Ebene der Kamera zugewandt (mehr oder weniger), aber es gibt keinen Up-Vektor, so dass es oft auf dem Kopf steht.
Im zweiten Ansatz verwendete ich QMatrix4x4 :: LookAt (const & Auge QVector3D, const & Zentrum QVector3D, const QVector3D & nach oben), weil ich aus wie genau klingt, was ich brauche, aber sobald ich mich bewege, verschwindet das Flugzeug. Ich habe versucht, etwas mehr Material mit QQuaterions aber ich bin ein bisschen überwältigt von der Mathematik und die Möglichkeiten
// camera
Qt3DRender::QCamera* camera = view->camera();
camera->lens()->setPerspectiveProjection(90.0f, 16.0f/9.0f, 0.1f, 1000.0f);
camera->setPosition(QVector3D(2.0f, 2.0f, 2.0f));
camera->setUpVector(QVector3D(0, 1, 0));
camera->setViewCenter(QVector3D(0, 0, 0));
// controls
Qt3DExtras::QFirstPersonCameraController* camController = new Qt3DExtras::QFirstPersonCameraController(rootEntity);
camController->setCamera(camera);
// emmits the new camera position to rotate function
QObject::connect(camera, &Qt3DRender::QCamera::positionChanged, plane, &Plane::rotate);
// Plane::rotate
void Plane::rotate(QVector3D target)
{
// first
planeTransform->setRotation(QQuaternion::rotationTo(planeTransform->translation(), target));
// second
QMatrix4x4 matrix = planeTransform->matrix();
matrix.lookAt(planeTransform->translation(),target,QVector3D(0,1,0));
planeTransform->setMatrix(matrix);
}