Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/140.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 对象坐标_C++_Qt_Openscenegraph - Fatal编程技术网

C++ 对象坐标

C++ 对象坐标,c++,qt,openscenegraph,C++,Qt,Openscenegraph,我正在使用具有OSGWidget的QT应用程序。如何在osg查看器中获取拾取对象的坐标并将其传输到对话框窗口中的QT textEdit。您能给我一些建议,如何从查看器中提取所选对象的osg::Vec3d,将其转换为字符串并显示出来吗?例如我有以下场景: 当我点击“添加”按钮时,它会打开一个对话框窗口,其中有一个文本编辑对象。传输此文本中的坐标。这怎么可能呢?忘记添加此多维数据集是从ads文件导入的。它可能在任何地方都有帮助。为了从场景中检索对象的坐标,您需要向查看器添加新的事件处理程序。让我们

我正在使用具有OSGWidget的QT应用程序。如何在osg查看器中获取拾取对象的坐标并将其传输到对话框窗口中的QT textEdit。您能给我一些建议,如何从查看器中提取所选对象的osg::Vec3d,将其转换为字符串并显示出来吗?例如我有以下场景:


当我点击“添加”按钮时,它会打开一个对话框窗口,其中有一个文本编辑对象。传输此文本中的坐标。这怎么可能呢?忘记添加此多维数据集是从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 );