C++ 对象坐标
我正在使用具有OSGWidget的QT应用程序。如何在osg查看器中获取拾取对象的坐标并将其传输到对话框窗口中的QT textEdit。您能给我一些建议,如何从查看器中提取所选对象的osg::Vec3d,将其转换为字符串并显示出来吗?例如我有以下场景:C++ 对象坐标,c++,qt,openscenegraph,C++,Qt,Openscenegraph,我正在使用具有OSGWidget的QT应用程序。如何在osg查看器中获取拾取对象的坐标并将其传输到对话框窗口中的QT textEdit。您能给我一些建议,如何从查看器中提取所选对象的osg::Vec3d,将其转换为字符串并显示出来吗?例如我有以下场景: 当我点击“添加”按钮时,它会打开一个对话框窗口,其中有一个文本编辑对象。传输此文本中的坐标。这怎么可能呢?忘记添加此多维数据集是从ads文件导入的。它可能在任何地方都有帮助。为了从场景中检索对象的坐标,您需要向查看器添加新的事件处理程序。让我们
当我点击“添加”按钮时,它会打开一个对话框窗口,其中有一个文本编辑对象。传输此文本中的坐标。这怎么可能呢?忘记添加此多维数据集是从ads文件导入的。它可能在任何地方都有帮助。为了从场景中检索对象的坐标,您需要向查看器添加新的事件处理程序。让我们称之为
PickHandler
这里有一个基本的代码,可以让你开始。您需要添加“includes”并修改它以满足您的需要。(请注意,我还没有测试它。我是“通过内存”编写的,但如果有任何错误,应该很容易修复)
PickHandler.h
class PickHandler: public QObject, public osgGA::GUIEventHandler {
Q_OBJECT
public:
PickHandler();
virtual bool handle( const osgGA::GUIEventAdapter& ea,
osgGA::GUIActionAdapter& aa );
signals:
void query( osg::Vec3f );
protected:
virtual ~PickHandler()
{
}
bool pick( const double x, const double y, osgViewer::Viewer* viewer );
private:
bool getPickedPoint( const double x, const double y, float buffer,
osgViewer::Viewer* viewer, osg::Vec3f& point );
};
PickHandler.cpp
PickHandler::PickHandler() : osgGA::GUIEventHandler()
{
}
bool PickHandler::handle( const osgGA::GUIEventAdapter &ea,
osgGA::GUIActionAdapter &aa )
{
osgViewer::View* viewer = dynamic_cast<osgViewer::Viewer*>( &aa );
if( !viewer ) {
return false;
}
switch( ea.getEventType() ) {
default:
break;
case osgGA::GUIEventAdapter::RELEASE: {
if( pick(ea.getXnormalized(), ea.getYnormalized(),
viewer ) )
{
return true;
}
break;
}
}
return false;
}
bool PickHandler::pick( const double x, const double y,
osgViewer::Viewer* viewer )
{
if( !viewer->getSceneData() ) {
return false;
}
osg::Vec3f point;
float buffer = 0.005f;
if( getPickedPoint( x, y, buffer, viewer, point ) ) {
emit query( point );
}
return false;
}
bool PickHandler::getPickedPoint( const double x, const double y, float buffer,
osgViewer::Viewer* viewer,
osg::Vec3f& point )
{
osg::ref_ptr<osgUtil::PolytopeIntersector> intersector( 0 );
try {
intersector = new osgUtil::PolytopeIntersector(
osgUtil::Intersector::PROJECTION,
x - buffer, y - buffer, x + buffer,
y + buffer )
;
} catch( const std::bad_alloc& ) {
return false;
}
// DimZero = check only for points
intersector->setDimensionMask( osgUtil:: PolytopeIntersector::DimZero );
//
intersector->setIntersectionLimit( osgUtil::Intersector::LIMIT_NEAREST );
osgUtil::IntersectionVisitor iv( intersector );
viewer->getCamera()->accept( iv );
if( intersector->containsIntersections() ) {
osgUtil::PolytopeIntersector::Intersection intersection =
*( intersector->getIntersections().begin() )
;
const osg::Vec3f& P = intersection.intersectionPoints[ 0 ];
if( P.isNaN() ) {
return false;
}
point.set( P[ 0 ], P[ 1 ], P[ 2 ] );
return true;
}
return false;
}
将使用小数点后6位的定点格式对点的x坐标进行字符串化。Wow!谢谢你的例子。我会研究它,并尝试将其应用到我的项目中。我想补充一点,您需要将
osg::Viewer*Viewer
更改为osg::View*Viewer
,否则动态转换将无法工作。@DanielR。谢谢你指出!我现在就换。
const QString x = QString::number( point[0], 'd', 6 );