微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决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.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?