我正在尝试在 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);
}