2017-04-10 5 views
0

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); 

} 

Antwort

0

Diese

// first 
planeTransform->setRotation(QQuaternion::rotationTo(planeTransform- 
>translation(), target)); 

mir sehr verdächtig aussieht wie die docs sagen:

QQuaternion QQuaternion :: rotationTo (const QVector3D & von, const QVector3D & bis)

Gibt die kürzeste Quaternion des Bogens zurück, um aus der vom Vektor beschriebenen Richtung in die durch den Vektor beschriebene Richtung zu rotieren.

Also beide Argumente müssen Orientierungsrichtungen sein. Und das erste Argument ist dann die Normale Ihres Flugzeugs?