如何解决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 举报,一经查实,本站将立刻删除。