【问题标题】:Qt3d BillboardingQt3d 广告牌
【发布时间】:2017-04-10 13:27:33
【问题描述】:

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

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

在第二种方法中,我使用了 QMatrix4x4::lookAt(const QVector3D &eye, const QVector3D &center, const QVector3D &up) 因为我听起来正是我需要的,但是一旦我移动,飞机就会消失。 我用 QQuterions 尝试了更多的东西,但我对数学和可能性有点不知所措

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

}

【问题讨论】:

    标签: c++ qt qt3d


    【解决方案1】:

    这个

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

    正如文档所说,在我看来非常可疑:

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

    返回从向量from描述的方向旋转到向量to描述的方向的最短圆弧四元数。

    所以两个参数都必须是方向。 那么第一个参数就是你飞机的法线?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-01-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多