0

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

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

在第二种方法中,我使用了 QMatrix4x4::lookAt(const QVector3D &eye, const QVector3D ¢er, 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);

}
4

1 回答 1

0

这个

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

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

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

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

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

于 2017-05-01T13:15:42.900 回答