Qt 信号到插槽连接:循环内迭代触发信号 设置光线投射器

Qt 信号到插槽连接:循环内迭代触发信号 设置光线投射器,qt,signals-slots,qt3d,Qt,Signals Slots,Qt3d,我将添加到根实体并将其信号连接到插槽: void MySceneClass::createRootEntity() { // ... //将光线投射器添加到根图元 m_rayCaster=新的Qt3DRender::QRayCaster(m_rootEntity); m_rayCaster->setRunMode(Qt3DRender::QAbstractRayCaster::SingleShot); m_rootEntity->addComponent(m_rayCaster); //设置信号

我将添加到根实体并将其信号连接到插槽:

void MySceneClass::createRootEntity()
{
// ...
//将光线投射器添加到根图元
m_rayCaster=新的Qt3DRender::QRayCaster(m_rootEntity);
m_rayCaster->setRunMode(Qt3DRender::QAbstractRayCaster::SingleShot);
m_rootEntity->addComponent(m_rayCaster);
//设置信号到插槽的连接
QObject::connect(m_rayCaster和Qt3DRender::QRayCaster::hitsChanged,
这,&MySceneClass::handleRayCasterHits);
// ...
}
我记录射线施法者按槽命中的次数:

void MySceneClass::handleRayCasterHits(常量Qt3DRender::QAbstractRayCaster::Hits)
{
qDebug()castRay(QVector3D(i,i,50.0f))//原点
QVector3D(0.0f,0.0f,-1.0f),//方向
-1//length(-1表示无限长)
);
}
}

问题 问题是,在所有测试中,只有
triggerRayCaster()
内触发器循环的最后一次迭代
handleRayCasterHits()
内的插槽捕获并记录


我不明白为什么。我遗漏了什么吗?

要理解为什么会发生这种情况,您需要了解Qt3D的工作原理:

  • Qt3D在线程中执行所有操作。渲染、逻辑和其他一切都有自己的线程,并且是并行执行的(除非您告诉它不要这样做)

  • Qt3D有一个前端(您在代码中使用的内容)和一个后端。前端节点转换为后端节点。例如,请看一看。渲染线程收集所有渲染后端节点,并在渲染阶段执行它们。所有其他线程对其后端节点(逻辑、输入等)执行相同的操作。每当前端节点发生更改时,它们都会通知后端节点,以便它们可以相应地修改其内容,或者被删除或创建

  • 这意味着,您在示例代码中所做的是快速(因为for循环在微秒内执行)设置要在光线投射器上投射的光线的方向,但这尚未投射光线。实际光线投射发生在处理与前端光线投射器节点对应的后端节点的后端线程执行光线投射时。这绝不可能在执行循环所需的几微秒内发生这就是为什么需要回调函数来获得命中,而不能简单地投射光线并在下一行代码中获得结果的原因。

    解决方案: 您需要做的是从回调函数中投射下一条光线,并在某个位置存储和索引,告诉您何时停止投射新光线,或者使用一个间隔为100ms的计时器(这应该足以让Qt3D的所有线程至少执行一次,因为它可能以30fps的速度运行)触发光线投射