Qt3d Billboarding

时间:2017-04-10 13:27:34

标签: c++ qt qt3d

我试图在Qt 5.8 C ++中实现广告牌。每当我四处走动时,我想让一个实体面向相机。 我有一个相机,第一人控制和一个带有QTransform,QDiffuseMapMaterial和QPlaneMesh的飞机实体。 我'我没有在openGL教程中找到的矩阵乘法做了一些尝试,因为我认为在Qt3D中可能有一个更简单的解决方案。

在第一种方法中,平面面向摄像机(或多或少),但没有向上矢量,因此通常是颠倒的。

在第二种方法中,我使用了QMatrix4x4 :: lookAt(const QVector3D& eye,const QVector3D& center,const QVector3D& up)因为我听起来就像我需要的那样,但是一旦我移动,飞机消失。 我用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);

}

1 个答案:

答案 0 :(得分:0)

这个

// first
planeTransform->setRotation(QQuaternion::rotationTo(planeTransform-
>translation(), target));
正如文档所说,

对我来说非常可疑:

  

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

     

返回最短弧四元数,以便从向量描述的方向旋转到向量描述的方向。

所以两个论点都必须是方向指示。 然后第一个参数就是飞机的法线?