连续触发光线投射测试

2024-01-29

下列的这个答案 https://stackoverflow.com/a/54901850/3405291,我正在进行连续的光线投射:

m_rayCaster = new Qt3DRender::QRayCaster(m_scene->rootEntity());
m_rayCaster->setRunMode(Qt3DRender::QAbstractRayCaster::SingleShot);
m_scene->rootEntity()->addComponent(m_rayCaster);

我有这些插槽要处理whether and when应进行下一次连续光线投射测试:

QObject::connect(m_rayCaster, &Qt3DRender::QRayCaster::hitsChanged, this, &RayCastHandler::handleRayCasterHits);
QObject::connect(m_rayCaster, &Qt3DCore::QNode::enabledChanged, this, &RayCastHandler::handleRayCasterEnabledChange);
QObject::connect(this, &RayCastHandler::isPreviousTestDoneChanged, this, &RayCastHandler::handleIsPreviousTestDoneChange);
QObject::connect(this, &RayCastHandler::isNextTestRequiredChanged, this, &RayCastHandler::handleIsNextTestRequiredChange);

插槽设置条件并检查它们:

void RayCastHandler::handleRayCasterHits(const Qt3DRender::QAbstractRayCaster::Hits hits)
{
    analyzeHits(hits);
    bool required = isNextTestRequired(/* according to m_testCounter, m_testsTotal, ... */);
    emit isNextTestRequiredChanged(required);
    emit isPreviousTestDoneChanged(true);
    return;
}

void RayCastHandler::handleRayCasterEnabledChange(const bool enabled)
{
    m_isRayCasterEnabled = enabled;
    triggerNextTestIfAllConditionsAreTrue();
    return;
}

void RayCastHandler::handleIsPreviousTestDoneChange(const bool done)
{
    m_isPreviousTestDone = done;
    triggerNextTestIfAllConditionsAreTrue();
    return;
}

void RayCastHandler::handleIsNextTestRequiredChange(const bool required)
{
    m_isNextTestRequired = required;
    if (!m_isNextTestRequired)
        emit rayCastResultsChanged(m_collisions);
    triggerNextTestIfAllConditionsAreTrue();
    return;
}

检查是否需要下一次光线投射测试的代码:

bool RayCastHandler::isNextTestRequired(int &testCounter, const int &testsTotal)
{
    testCounter++;
    if (testCounter >= testsTotal) {
        return false;
    }
    return true;
}

最后,检查触发下一次光线投射测试的所有条件的函数是:

bool RayCastHandler::triggerNextTestIfAllConditionsAreTrue()
{
    if (m_isPreviousTestDone && m_isNextTestRequired && m_isRayCasterEnabled) {
        triggerTest(/* Will trigger next ray cast test */);
        m_isPreviousTestDone = false;
        m_isNextTestRequired = false;
        m_isRayCasterEnabled = false;
    }
}

该代码工作正常,但在投射几条连续的光线后,它停止了。

通过登录到控制台,我观察到m_rayCaster看起来是随机启用/禁用的。我的意思是,有时在完成光线投射测试后,它会自行禁用,有时会自行启用!我想知道是否有人可以介绍一下参考Qt3DRender::QRayCaster启用/禁用逻辑。我稍微查看了它的源代码,我想知道源代码的哪一部分可以帮助我弄清楚。


只是想分享我的观察:

我通过仅保留两个信号槽连接来简化代码:

QObject::connect(m_rayCaster, &Qt3DRender::QRayCaster::hitsChanged, this, &RayCastHandler::handleRayCasterHits);
QObject::connect(m_rayCaster, &Qt3DCore::QNode::enabledChanged, this, &RayCastHandler::handleRayCasterEnabledChange);

一个插槽分析光线投射器的命中:

void RayCastHandler::handleRayCasterHits(const Qt3DRender::QAbstractRayCaster::Hits hits)
{
    analyzeHits( ... , hits);
    return;
}

如果光线投射器已禁用自身,则另一个插槽将运行下一个连续的光线投射测试:

void RayCastHandler::handleRayCasterEnabledChange(const bool enabled)
{
    // When the component disables itself, it is ready for the next ray-cast test
    if (!enabled) {
        bool required = isNextTestRequired( ... );
        if (required)
            triggerTest( ... );
        else
            // Send final ray-cast results by a signal, if next test is NOT needed
            emit rayCastResultsChanged( ... );
    }
    return;
}

只要我延迟触发光线投射测试,上面的代码就可以工作。有时我必须增加上述延迟时间才能使其发挥作用。但至少它有效。尽管这很痛苦,因为它不可靠:

void RayCastHandler::triggerTest( ... )
{
    ...
    // 1 millisecond delay time
    QTimer::singleShot(1, [rayCaster, origin, direction, length](){rayCaster->trigger(origin, direction, length);});

    ...
}

但是,如果我不使用延迟时间,在某些时候,光线投射器会意外停止,不会发送任何包含命中结果的信号,并且光线投射器会保持不变enabled永远。看起来光线投射器卡住了:

void RayCastHandler::triggerTest( ... )
{
    ...
    // No delay
    rayCaster->trigger(origin, direction, length);

    ...
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

连续触发光线投射测试 的相关文章

  • Qt 3D的研究(三):显示3D模型

    Qt 3D的研究 三 显示3D模型 上一篇文章介绍了如何使用最少的代码创建一个Qt 3D的应用 和大家最初接触的glut一样 对于3D应用来说 需要做的准备工作还真不少 不过呢 Qt 3D把一些窗口相关的琐碎事情解决了 剩下的 该由我们完成
  • [Qt3d] 导出QtEntity为Obj格式(遍历QtEntity)

    原文链接 https www yuque com softdev qt txv1lx class Qui3DView private struct date struct QPointer
  • Qt3d 使用 QSceneLoader 和 qt 5.8

    我尝试使用 QSceneLoader 加载在外部编辑器中创建的 3D 场景 但没有成功 我总是在加载阶段得到断言 我使用 OBJ 模型 qt 的示例 它很容易加载为 QMesh 测试仓库https bitbucket org ibnz te
  • QML 加载并显示具有颜色属性的 .ply 网格

    我正在尝试使用 QML 从斯坦福 PLY 文件加载一个带有每个顶点颜色信息的简单立方体 我的实体看起来像这样 Entity id circle property Material materialPoint Material effect
  • 禁用 Qt 3d 中的所有光源

    在我的公司 从旧的 3D 引擎转向 Qt3d 这项工作的目标之一是将旧 3D 引擎的渲染视图与 Qt3d 渲染进行比较 为此 我编写了一个小型示例应用程序 我可以在其中比较新旧渲染 仍然存在很多差异 我的第一个想法是切换两个引擎中的所有光源
  • 在 Qt3D 中导入对象不起作用,但没有错误消息

    我有一个导入 STL 文件格式的 Qt3D 应用程序 m sceneLoaderEntity new Qt3DCore QEntity m sceneLoaderEntity gt setObjectName New imported en
  • 使用 C++ 在 Qt3D 中创建多个视口时出现问题

    我正在尝试使用 C 设置具有多个视口的 Qt3DWindow 根据文档和提供了 QML 示例 我需要做的就是创建一个框架图 其中一个主要的 QViewport 对象分支为几个 RenderView 第一个 RenderView 包含 QCl
  • Qt3d:应用 Qt3DRender::QLayerFilter 时显示的工件

    我正在尝试使用图层过滤 如图所示这个答案 为此 我编写了一个简单的测试 见下文 这是question 在红色球体的某个位置 会出现伪影 看起来像是另一个摄像机在坐标 0 0 0 0 0 0 中的显示 See screen 在我的示例中 可以
  • PyQt5 中包含的 3D 窗口

    我正在使用 PyQt5 并尝试将包含的 3D 窗口实现到从 ui 文件生成的 python 文件中 我创建了一个 contains3dWindow 类 它继承自 QWidget 它只创建一个 3D 窗口 并且我试图将包含的窗口添加到主窗口文
  • QML 将纹理应用于网格

    我正在尝试将图像纹理应用到 QML Qt 5 6 2 中的网格 我从示例 Shadow Map QML 开始 我想对 GroundPlane 进行纹理处理 材质和效果 qml 类应用于该 GroundPlane 网格 但我看不到如何应用图像
  • 连续触发光线投射测试

    下列的这个答案 https stackoverflow com a 54901850 3405291 我正在进行连续的光线投射 m rayCaster new Qt3DRender QRayCaster m scene gt rootEnt
  • 带有 QML 的 FbxGeometryLoader

    我想将 fbx 文件导入到我的Scene3D https doc qt io qt 5 11 qml qtdatavisualization scene3d html 通过QMesh https doc qt io qt 5 11 qt3d
  • QScreenRayCaster 未找到实体。我做错了什么?

    Qt3D 中新 QScreenRayCaster 的描述看起来正是我想要使用的 但我无法让它为我工作 我想在初始化中我需要做一些事情 但我在网上找不到任何示例来为我指明正确的方向 我编写了一个非常简单的程序来测试该功能 它在窗口的中心绘制一
  • Qt3D动态纹理

    我正在开发包含 Qt3D 视图的软件 这个 3D 视图使我们能够可视化元素 对象的所有渲染部分都是使用自定义材质 着色器在 QML 中完成的 我能够创建一种将纹理传递到着色器以进行纹理化的材质 保存纹理的QML对象是Texture2D 它的
  • Qt3D 是 Qt5 的一部分吗?

    我在windows中安装了Qt5库 但Qt助手中没有关于Qt3D的文档 Qt3D 是 Qt5 的一部分还是已从发布版本 5 中删除 是的 Qt 3D 成为标准 Qt 库Qt 5 7 发布 http blog qt io blog 2016
  • 如何在Qt3D中优化点云渲染

    我正在尝试使用 Qt3D 显示大型点云 20M pts 我第一次发现这个图书馆https github com MASKOR Qt3DPointcloudRenderer https github com MASKOR Qt3DPointc
  • PySide2 Qt3D 网格不显示

    我正在深入研究 Qt3D 框架 并决定复制该框架的简化版本时间 2019 03 24 标签 c https doc qt io qtforpython overviews qt3d basicshapes cpp example html
  • 在 QML 中控制纹理 3D 对象的不透明度

    我对 QML 中的 Qt 3D 有点陌生 我正在尝试控制 Qt 3D 的不透明度textured3D 对象 我正在使用简单qml3d https github com tripolskypetr simpleqml3d测试项目来做到这一点
  • GLSL聚光投影体积

    在我的开源项目中 我使用 Qt3D 设置了延迟渲染管道 到目前为止一切顺利 但现在我想通过添加聚光灯投影量来继续前进 例如场景中好像有烟雾 像这样 我正在使用的片段着色器位于问题的末尾 我读过 对于每个片段 我应该从光位置进行光线行进并找到
  • 了解 Qt3D 创建的网格

    我创建了一个 Qt3D 网格 如下所示 Qt3DCore QEntity newEntity new Qt3DCore QEntity Qt3DExtras QConeMesh mesh new Qt3DExtras QConeMesh m

随机推荐