【问题标题】:Qt3D: using Qt3DRender::QLayerFilterQt3D:使用 Qt3DRender::QLayerFilter
【发布时间】:2019-12-21 14:48:53
【问题描述】:

我正在尝试使用层过滤,如 this answer 所示。为此,我编写了一个简单的测试(见下文)。 如果我将代码从 My3DWindow 类传输到 main.cpp - 此代码有效。 My3DWindow 类中的错误在哪里?完整的测试项目可以查看here

ma​​in.cpp

int main(int argc, char *argv[])
{
    QGuiApplication application(argc, argv);
    auto window = new My3DWindow;

    auto sphere1 = new Qt3DCore::QEntity(window->Scene());
    auto sphere2 = new Qt3DCore::QEntity(window->Scene());

    auto transform1 = new Qt3DCore::QTransform;
    transform1->setTranslation(QVector3D(0.0f, 0.0f, -10.0f));

    auto transform2 = new Qt3DCore::QTransform;
    transform2->setTranslation(QVector3D(-10.0f, 0.0f, 0.0f));

    auto material1 = new Qt3DExtras::QPhongMaterial;
    material1->setAmbient(Qt::blue);

    auto material2 = new Qt3DExtras::QPhongAlphaMaterial;
    material2->setAmbient(Qt::red);

    auto spheremesh = new Qt3DExtras::QSphereMesh;
    spheremesh->setRadius(15.0);
    spheremesh->setSlices(32);
    spheremesh->setRings(32);

    sphere1->addComponent(transform1);
    sphere1->addComponent(material1);
    sphere1->addComponent(spheremesh);
    sphere1->addComponent(window->OpaqueLayer());

    sphere2->addComponent(transform2);
    sphere2->addComponent(material2);
    sphere2->addComponent(spheremesh);
    sphere2->addComponent(window->TransparentLayer());

    window->show();
    return application.exec();
}

My3DWindow 类

My3DWindow::My3DWindow(QScreen *screen):
    Qt3DExtras::Qt3DWindow(screen)
{
    m_Scene = new Qt3DCore::QEntity;
    setRootEntity(m_Scene);

    auto renderSurfaceSelector = new Qt3DRender::QRenderSurfaceSelector(m_Scene);
    renderSurfaceSelector->setSurface(this);
    auto clearBuffers = new Qt3DRender::QClearBuffers(renderSurfaceSelector);
    clearBuffers->setBuffers(Qt3DRender::QClearBuffers::AllBuffers);
    clearBuffers->setClearColor(Qt::gray);

    auto viewport = new Qt3DRender::QViewport(renderSurfaceSelector);
    auto cameraSelector = new Qt3DRender::QCameraSelector(viewport);
    m_Camera = new Qt3DRender::QCamera(cameraSelector);
    m_Camera->lens()->setPerspectiveProjection(45.0f, 16.0f/9.0f, 0.1f, 1000.0f);
    m_Camera->setPosition(QVector3D(0.0f, 0.0f, 100.0f));
    m_Camera->setViewCenter(QVector3D(0.0f, 0.0f, 0.0f));

    auto cameraController = new Qt3DExtras::QFirstPersonCameraController(m_Scene);
    cameraController->setCamera(m_Camera);

    m_TransparentLayer = new Qt3DRender::QLayer;
    auto transparentFilter = new Qt3DRender::QLayerFilter(m_Camera);
    transparentFilter->addLayer(m_TransparentLayer);

    m_OpaqueLayer = new Qt3DRender::QLayer;
    auto opaqueFilter = new Qt3DRender::QLayerFilter(m_Camera);
    opaqueFilter->addLayer(m_OpaqueLayer);

    setActiveFrameGraph(renderSurfaceSelector);
}

【问题讨论】:

  • 您将代码从 My3DWindow.cpp 移动到 main.cpp,然后您可以做不同的事情是像 renderSurfaceSelector->setSurface(this) 这样的“父”依赖项。我们还没有看到 main.cpp 的工作案例,还没有发现真正的不同之处。
  • @AlexanderV 我的错。 1)在早上而不是晚上编码需要。 2)我在初始化相机后(在声明“cameraController”之前)错过了一个重要的行:cameraSelector->setCamera(m_Camera);完全正确的代码我会发布here但是一个小问题仍然存在。有时测试应用程序在关闭时会崩溃。可能是什么原因?
  • @AlexanderV 还出现了在某些球体叠加处显示伪影的问题。听起来不错。但这可能是一个单独的问题。只需尝试在完整的测试代码中按下 WSAD 按钮。

标签: c++ qt qt3d


【解决方案1】:

关于主要问题的正确代码如下。剩下的问题描述here

My3DWindow 类:

My3DWindow::My3DWindow(QScreen *screen):
    Qt3DExtras::Qt3DWindow(screen)
{
    m_Scene = new Qt3DCore::QEntity;
    setRootEntity(m_Scene);

    auto renderSurfaceSelector = new Qt3DRender::QRenderSurfaceSelector(m_Scene);
    renderSurfaceSelector->setSurface(this);
    auto clearBuffers = new Qt3DRender::QClearBuffers(renderSurfaceSelector);
    clearBuffers->setBuffers(Qt3DRender::QClearBuffers::AllBuffers);
    clearBuffers->setClearColor(Qt::gray);

    auto viewport = new Qt3DRender::QViewport(renderSurfaceSelector);
    auto cameraSelector = new Qt3DRender::QCameraSelector(viewport);

    m_Camera = new Qt3DRender::QCamera(cameraSelector);
    m_Camera->lens()->setPerspectiveProjection(45.0f, 16.0f/9.0f, 0.1f, 1000.0f);
    m_Camera->setPosition(QVector3D(0.0f, 0.0f, 100.0f));
    m_Camera->setViewCenter(QVector3D(0.0f, 0.0f, 0.0f));

    cameraSelector->setCamera(m_Camera);

    auto cameraController = new Qt3DExtras::QFirstPersonCameraController(m_Scene);
    cameraController->setCamera(m_Camera);

    // именно в таком порядке: m_OpaqueLayer, m_TransparentLayer
    m_OpaqueLayer = new Qt3DRender::QLayer;
    auto opaqueFilter = new Qt3DRender::QLayerFilter(m_Camera);
    opaqueFilter->addLayer(m_OpaqueLayer);

    m_TransparentLayer = new Qt3DRender::QLayer;
    auto transparentFilter = new Qt3DRender::QLayerFilter(m_Camera);
    transparentFilter->addLayer(m_TransparentLayer);

    setActiveFrameGraph(renderSurfaceSelector);
}

main.cpp:

My3DWindow window;

改为

auto window = new My3DWindow;

【讨论】:

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