首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >OSG/OSGEarth如何移动照相机

OSG/OSGEarth如何移动照相机
EN

Stack Overflow用户
提问于 2018-06-19 13:19:00
回答 2查看 1.2K关注 0票数 1

我正在用OSGEarth做一个无人机模拟器。我从来没有使用过OSG,所以我有一些麻烦,以了解相机。我试图移动一个相机到一个特定的位置(lat/lon)与一个特定的滚动,俯仰和偏航在OSG地球。

我需要多个摄像头,所以我使用了一个复合查看器。但我不知道怎么移动特定的摄像机。目前,我有一个与EarthManipulator工作良好。

代码语言:javascript
运行
复制
 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 : 
           // https://stackoverflow.com/questions/32595198/controling-openscenegraph-camera-with-cartesian-coordinates-and-euler-angles
           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/高度)。但是方向是完全错误的,我找不到我需要“修正”轴线的地方。

事实上,我的无人机在法国,但是“向上”的传播方式不好,它仍然向北,而不是相对于地面的“垂直”。看看我在正确的摄像机上得到了什么

我需要一个偏航相对于北(0 ==>北),当我的滚动和俯仰设置为零时,我需要“平行”到地面。

我的方法(通过制造一个机械手)是最好的方法吗?我能把相机对象放在图形节点(在osgEarth::GeoTransform后面(它适用于我的模型)吗?

谢谢:)

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-06-20 18:16:37

在过去,我做了一个可爱的技巧,包括使用一个ObjectLocator对象(获取世界位置和平面切线到表面方向),并结合一个矩阵应用HPR。里面有个倒置器,把它变成摄像机的方位矩阵,而不是物体的放置矩阵,但是它的工作正常。

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

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

AlphaPixel做很多遥测/ osgEarth类型的东西,所以如果你需要帮助就大声喊。

票数 1
EN

Stack Overflow用户

发布于 2018-06-19 18:03:11

这可能只是你旋转的顺序-矩阵和四元数乘法是顺序依赖的。我建议:

  1. 尝试在你的MakeRotate呼叫中交换音高和滚动顺序。
  2. 如果这不起作用,一次将除1次外的所有旋转设置为0°,确保每一次都符合您的期望,然后您可以处理订单(只有6个可能的订单)。
  3. 您还可以使单个四元数q1、q2、q3,其中每一个分别表示h、p和r,并自己乘以它们来控制顺序。这就是您所使用的MakeRotate重载在引擎盖下所做的。

通常情况下,你想先做你的偏航,然后是你的投球,然后是你的滚动(或者如果你愿意的话,你可以完全跳过滚),但我不记得是从旁开始的,不管是osg::quat,以一种前、后的方式连接起来,所以它可以是p-r-y顺序。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50929527

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档