Qt3D Billboards:如何让飞机始终面对相机
Qt3D Billboards: how to make plane always face to camera
我尝试用camera的viewVector使平面正对camera,但是当camera向左或向右旋转时,它会顺时针或逆时针旋转。
能不能不顺时针或逆时针转动,让飞机一直对着相机?
我想camera->upVector()
也许可以帮到我,但我不知道怎么用。
我的代码:
class planeTransformClass : public Qt3DCore::QTransform {
public:
planeTransformClass( Qt3DCore::QNode *entity = nullptr ) :Qt3DCore::QTransform(entity) {}
signals:
void faceTo( QVector3D v ) {
setRotation(QQuaternion::rotationTo(QVector3D(0,1,0), -v));
} ;
};
// Background
Qt3DCore::QEntity *planeEntity = new Qt3DCore::QEntity(rootEntity);
Qt3DExtras::QPlaneMesh *planeMesh = new Qt3DExtras::QPlaneMesh(planeEntity);
planeMesh->setHeight(2);
planeMesh->setWidth(2);
Qt3DExtras::QTextureMaterial planeMaterial = new Qt3DExtras::QTextureMaterial(planeEntity);
Qt3DRender::QTexture2D *planeTexture = new Qt3DRender::QTexture2D(planeMaterial);
FlippedTextureImage *planeTextureImage = new FlippedTextureImage(planeTexture);
planeTextureImage->setSize(QSize(3000, 3000));
planeTexture->addTextureImage(planeTextureImage);
planeMaterial->setTexture(planeTexture);
planeMaterial->setAlphaBlendingEnabled(true);
// Transform
planeTransformClass planeTransform = new planeTransformClass(planeEntity);
planeTransform->setRotationX(90);
planeTransform->setTranslation(QVector3D(2, 0, 0));
planeEntity->addComponent(planeMesh);
planeEntity->addComponent(planeMaterial);
planeEntity->addComponent(planeTransform);
// connect camera's viewVectorChanged
camera->connect( camera, &Qt3DRender::QCamera::viewVectorChanged,
planeTransform, &planeTransformClass::faceTo);
使用几何着色器的解决方案
已有C++翻译this QML code that I tried to translate(使用几何着色器):
https://github.com/ismailsunni/qt3d-custom-shader
我自己的翻译可以找到here. It works now after solving the issues mentioned in 。
没有几何着色器的解决方案
我得到了一个基于 this bug report. You can find my implementation on GitHub 的不同版本 运行ning。当相机移动时,广告牌不会改变它们的大小,即像其他所有对象一样在屏幕上变得越来越小,但我希望你能处理它。
在 master 分支上,由于某种原因,图像也会移动,如下图所示:
no_instanced_rendering
分支不使用实例化渲染并正确显示所有内容。
编辑
对不起,我没有使用你的例子,但我没有时间再调整它。查看与我提到的错误报告相关的 patch。这个人用这个效果实现了一个material,你应该能够提取它并使它成为运行。
我尝试用camera的viewVector使平面正对camera,但是当camera向左或向右旋转时,它会顺时针或逆时针旋转。
能不能不顺时针或逆时针转动,让飞机一直对着相机?
我想camera->upVector()
也许可以帮到我,但我不知道怎么用。
我的代码:
class planeTransformClass : public Qt3DCore::QTransform {
public:
planeTransformClass( Qt3DCore::QNode *entity = nullptr ) :Qt3DCore::QTransform(entity) {}
signals:
void faceTo( QVector3D v ) {
setRotation(QQuaternion::rotationTo(QVector3D(0,1,0), -v));
} ;
};
// Background
Qt3DCore::QEntity *planeEntity = new Qt3DCore::QEntity(rootEntity);
Qt3DExtras::QPlaneMesh *planeMesh = new Qt3DExtras::QPlaneMesh(planeEntity);
planeMesh->setHeight(2);
planeMesh->setWidth(2);
Qt3DExtras::QTextureMaterial planeMaterial = new Qt3DExtras::QTextureMaterial(planeEntity);
Qt3DRender::QTexture2D *planeTexture = new Qt3DRender::QTexture2D(planeMaterial);
FlippedTextureImage *planeTextureImage = new FlippedTextureImage(planeTexture);
planeTextureImage->setSize(QSize(3000, 3000));
planeTexture->addTextureImage(planeTextureImage);
planeMaterial->setTexture(planeTexture);
planeMaterial->setAlphaBlendingEnabled(true);
// Transform
planeTransformClass planeTransform = new planeTransformClass(planeEntity);
planeTransform->setRotationX(90);
planeTransform->setTranslation(QVector3D(2, 0, 0));
planeEntity->addComponent(planeMesh);
planeEntity->addComponent(planeMaterial);
planeEntity->addComponent(planeTransform);
// connect camera's viewVectorChanged
camera->connect( camera, &Qt3DRender::QCamera::viewVectorChanged,
planeTransform, &planeTransformClass::faceTo);
使用几何着色器的解决方案
已有C++翻译this QML code that I tried to translate(使用几何着色器):
https://github.com/ismailsunni/qt3d-custom-shader
我自己的翻译可以找到here. It works now after solving the issues mentioned in
没有几何着色器的解决方案
我得到了一个基于 this bug report. You can find my implementation on GitHub 的不同版本 运行ning。当相机移动时,广告牌不会改变它们的大小,即像其他所有对象一样在屏幕上变得越来越小,但我希望你能处理它。
在 master 分支上,由于某种原因,图像也会移动,如下图所示:
no_instanced_rendering
分支不使用实例化渲染并正确显示所有内容。
编辑 对不起,我没有使用你的例子,但我没有时间再调整它。查看与我提到的错误报告相关的 patch。这个人用这个效果实现了一个material,你应该能够提取它并使它成为运行。