How to set 3d object(QCylinderMesh, QSphereMesh) bounding volume to make QObjectPicker work an accurate way
-
the creation of the Cylinder looks below:
void Window3D::createCylinder()
{m_cylinderMesh = new Qt3DExtras::QCylinderMesh(); m_cylinderTransfrom = new Qt3DCore::QTransform(); m_cylinderMaterial = new Qt3DExtras::QPhongMaterial(); Qt3DRender::QObjectPicker *cylinderPick = new Qt3DRender::QObjectPicker(); connect(cylinderPick, SIGNAL(clicked(Qt3DRender::QPickEvent *)), this, SLOT(slotItemPicked(Qt3DRender::QPickEvent *))); m_cylinder = new Qt3DCore::QEntity(m_pRootEntity); m_cylinder->addComponent(m_cylinderMesh); m_cylinder->addComponent(m_cylinderTransfrom); m_cylinder->addComponent(m_cylinderMaterial); m_cylinder->addComponent(cylinderPick); m_cylinderMesh->setRadius(0.5); m_cylinderMesh->setLength(3); m_cylinderMesh->setRings(20); m_cylinderMesh->setSlices(20); m_cylinderTransfrom->setTranslation(QVector3D(-4, 4, 0));//set position
}
when clicked out around the object, it emit signal too, it seems the bounding volume is a sphere with radius = Cylinder.height.
when we create a sphere with QSphereMesh, picker works well. can somebody suppose a solution?
-
Hi @fisher103
I never used the object picker, so far. But I read about a QPickingSettings class, did you try it?
There is also the localIntersection() (in local coordinates of the cylinder) function of the QPickEvent. So you should be able to check for an exact hit yourself.
-Michael.
-
@m.sue localIntersection() of QPickEvent cannot work if you dont change pick method, because other items behide it cannot be triggered with mouse event.
use QPickingSettings in my code work but change the default scene environment setting causes lots of cpu using and react unsmooth.my code like this
{m_renderSettings = new Qt3DRender::QRenderSettings(m_pRootEntity); m_renderSettings->pickingSettings()->setPickMethod(Qt3DRender::QPickingSettings::TrianglePicking); m_renderSettings->setRenderPolicy(Qt3DRender::QRenderSettings::OnDemand); m_renderer = new Qt3DExtras::QForwardRenderer(); m_renderer->setCamera(m_cameraEntity); m_renderer->setSurface(this); m_renderSettings->setActiveFrameGraph(m_renderer); m_pRootEntity->addComponent(m_renderSettings);
}
qt5.9 Qt3dwindow can use renderSettings() directly but not for 5.8
is there any exmaple, thanks. -
Hi @fisher103
This is how I did it in earlier versions:
Qt3DRender::QRenderSettings *settings= qobject_cast<Qt3DRender::QRenderSettings*> activeFrameGraph()->parent()); if (settings) settings->setRenderPolicy(Qt3DRender::QRenderSettings::OnDemand);
-Michael.
-
@hhughe11 use code like this in your qt3dwindow
Qt3DRender::QRenderSettings *settings =
qobject_castQt3DRender::QRenderSettings* (activeFrameGraph()->parent());
if (settings)
settings->pickingSettings()->setPickMethod(Qt3DRender::QPickingSettings::TrianglePicking);