2017-04-10 74 views
0

我想在Qt 5.8 C++中實現廣告牌。每當我四處走動時,我都想讓一個實體面對相機。 我用QTransform,QDiffuseMapMaterial和QPlaneMesh獲得了相機,第一人稱控件和平面實體。 我在openGL-tutorials中發現了一些沒有矩陣乘法的嘗試,因爲我認爲Qt3D中可能有更簡單的解決方案。Qt3d廣告牌

在第一種方法中,飛機面向攝像機(或多或少),但沒有向上向量,所以它往往是顛倒的。

在第二種方法我用QMatrix4x4 ::的lookAt(常量QVector3D &眼,常量QVector3D &中心,常量QVector3D &時),因爲我聽起來像是正是我需要的,但只要我移動,飛機消失。 我試着用QQuaterions一些更多的東西,但我是一個有點數學不堪重負,準備

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

} 

回答

0

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

看起來很可疑我的文檔說:

QQuaternion QQuaternion :: rotationTo(const QVector3D & from,const QVector3D & to)

返回從矢量描述的方向旋轉到由矢量描述的方向旋轉的最短弧四元數。

所以兩個參數都必須是定位方向。 然後第一個參數是你的飛機的法線嗎?