Pick 事件有时是错误的,但光线投射总是正确的 问题解决方法问题理论QObjectPicker 的另一个问题

问题描述

我向这样的实体添加一个选择器:

    
picker = new Qt3DRender::QObjectPicker(entity);
picker->setHoverEnabled(false);
picker->setobjectName(QStringLiteral("__internal object picker ") + entity->objectName());
entity->addComponent(picker);
connect(picker,&Qt3DRender::QObjectPicker::pressed,this,&EditorScene::handlePickerPress);

同时,我的 3D 场景中有一个光线投射器:

Qt3DRender::QRayCaster *m_rayCaster;
m_rayCaster = new Qt3DRender::QRayCaster(rootEntity);
m_rayCaster->setRunMode(Qt3DRender::QAbstractRayCaster::SingleShot);
m_rayCaster->addLayer(m_scene->layerImport());
m_rayCaster->setFilterMode(Qt3DRender::QAbstractRayCaster::FilterMode::AcceptAnyMatchingLayers);
rootEntity->addComponent(m_rayCaster);
QObject::connect(m_rayCaster,&Qt3DRender::QRayCaster::hitsChanged,&Preview3r::handleRayCasterHits);

问题

选择器工作正常,除非鼠标从一个 3D 项目交替单击到另一个。在 3D 项目之间切换点击时,Qt3DRender::QPickEvent * 报告的选取的 3D 项目是之前点击的 3D 项目,而不是新点击的:

void EditorScene::handlePickerPress(Qt3DRender::QPickEvent *event)
{
    // Buggy:
    // pressed entity is wrong when switching/alternating clicks between 3D items:
    Qt3DCore::QEntity *pressedEntity = qobject_cast<Qt3DCore::QEntity *>(sender()->parent());
}

解决方法

解决方案是使用光线投射 Qt3DRender::QRayCasterHit 结果而不是 Qt3DRender::QPickEvent *

void EditorScene::handleRayCasterHit(Qt3DRender::QRayCasterHit hit)
{
    // Always works fine:
    QString name = hit.entity()->objectName();
    EditorSceneItem *item = sceneModel()->getItemByName(name);
}

问题

为什么会出现上述情况?我知道,这不是一个可重现的代码,但是代码库很大,很难转换成一个简单的例子。

理论

猜测可能是 Qt3DRender::QPickEvent 在幕后使用了光线投射。因此,在 Qt3DRender::QPickEvent 引擎盖下投射的光线可能会以某种方式与我正在做的其他光线投射发生冲突。似乎与此有关:

https://stackoverflow.com/a/54901850/3405291


更新

QObjectPicker 的另一个问题

我遇到了 Qt3DRender::QObjectPicker::pressed 信号的进一步问题。处理该信号以处理 3D 项目会导致分段错误。通过使用 eventFilter 方法处理鼠标按下事件并进行光线投射解决了分段错误

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...