OSG/OSGEarth 如何移动相机

OSG/OSGEarth How to move a Camera

我正在使用 OSGEarth 制作无人机模拟器。我以前从未使用过 OSG,所以我在理解相机方面遇到了一些麻烦。 我正在尝试将相机移动到特定位置 (lat/lon),并在 OSG Earth 中使用特定的滚动、俯仰和偏航。

我需要有多个摄像头,所以我使用了复合查看器。但我不明白如何移动特定的相机。 目前我有一个 EarthManipulator 可以正常工作。

 class NovaManipulator : publicosgGA::CameraManipulator {
         osg::Matrixd NovaManipulator::getMatrix() const
            {
              //drone_ is only a struct which contains updated infomations
              float roll = drone_->roll(),
              pitch = drone_->pitch(),
              yaw = drone_->yaw();

          auto position = drone_->position();
          osg::Vec3d world_position;
          position.toWorld(world_position);

          cam_view_->setPosition(world_position);

          const osg::Vec3d rollAxis(0.0, 1.0, 0.0);
          const osg::Vec3d pitchAxis(1.0, 0.0, 0.0);
          const osg::Vec3d yawAxis(0.0, 0.0, 1.0);

           //if found this code : 
           // 
           osg::Quat rotationQuat;
           rotationQuat.makeRotate(
               osg::DegreesToRadians(pitch + 90), pitchAxis,
               osg::DegreesToRadians(roll),          rollAxis,
               osg::DegreesToRadians(yaw),          yawAxis);

          cam_view_->setAttitude(rotationQuat);

          // I don't really understand this also
          auto nodePathList = cam_view_->getParentalNodePaths();
          return osg::computeLocalToWorld(nodePathList[0]);
        }

        osg::Matrixd NovaManipulator::getInverseMatrix() const
        {
          //Don't know why need to be inverted
          return osg::Matrix::inverse(getMatrix());
        } 
    };

然后我将操纵器安装到查看器。当我模拟世界时,相机在好的地方(Lat/Lon/Height)。 但是方向完全错误,我找不到我需要 "correct" 轴的位置。

实际上我的无人机在法国,但是 "up" 矢量不好,它仍然向北而不是 "vertical" 相对于地面。 See what I'm getting on the right camera

我需要相对于北偏航(0 ==> 北),当我的横滚和俯仰设置为零时,我需要 "parallel" 到地面。

我的方法(通过制作一个操纵器)是最好的吗? 我可以将相机对象放在图形节点内(在 osgEarth::GeoTransform 后面(它适用于我的模型))吗?

谢谢:)

这可能只是您的旋转顺序 - 矩阵和四元数乘法取决于顺序。我会建议:

  1. 尝试在 MakeRotate 调用中调换俯仰和滚动的顺序。
  2. 如果这不起作用,一次将除 1 个旋转之外的所有旋转设置为 0°,确保每个都是您所期望的,然后您可以玩这些命令(只有 6 个可能的命令)。
  3. 您还可以制作单独的四元数 q1、q2、q3,其中每个分别代表 h、p 和 r,然后自己将它们相乘以控制顺序。这就是您正在使用的 MakeRotate 重载在幕后所做的事情。

通常你想先做偏航,然后是俯仰,然后是翻滚(如果你愿意,也可以完全跳过翻滚),但我不记得 osg::quat 是否在 pre 中连接-mult 或 post-mult 时尚,所以它可以是 p-r-y 顺序。

过去,我做过一个可爱的技巧,涉及使用 ObjectLocator 对象(获取世界位置和平面切线到表面的方向),结合矩阵来应用 HPR。那里有一个反转使其成为相机方向矩阵而不是对象放置矩阵,但它工作正常。

http://forum.osgearth.org/void-ObjectLocator-setOrientation-default-orientation-td7496768.html#a7496844

要查看您的代码片段中发生了什么有点棘手,因为许多变量的类型并不明显。

AlphaPixel 做了很多遥测/osgEarth 类型的事情,如果您需要帮助,请大声说出来。