我试图在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);
}
答案 0 :(得分:0)
这个
// first
planeTransform->setRotation(QQuaternion::rotationTo(planeTransform-
>translation(), target));
正如文档所说,对我来说非常可疑:
QQuaternion QQuaternion :: rotationTo(const QVector3D& from,const QVector3D& to)
返回最短弧四元数,以便从向量描述的方向旋转到向量描述的方向。
所以两个论点都必须是方向指示。 然后第一个参数就是飞机的法线?