我正在用OSGEarth做一个无人机模拟器。我从来没有使用过OSG,所以我有一些麻烦,以了解相机。我试图移动一个相机到一个特定的位置(lat/lon)与一个特定的滚动,俯仰和偏航在OSG地球。
我需要多个摄像头,所以我使用了一个复合查看器。但我不知道怎么移动特定的摄像机。目前,我有一个与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 :
// 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
后面(它适用于我的模型)吗?
谢谢:)
发布于 2018-06-20 18:16:37
在过去,我做了一个可爱的技巧,包括使用一个ObjectLocator对象(获取世界位置和平面切线到表面方向),并结合一个矩阵应用HPR。里面有个倒置器,把它变成摄像机的方位矩阵,而不是物体的放置矩阵,但是它的工作正常。
要查看代码片段中发生了什么有点棘手,因为许多变量的类型并不明显。
AlphaPixel做很多遥测/ osgEarth类型的东西,所以如果你需要帮助就大声喊。
发布于 2018-06-19 18:03:11
这可能只是你旋转的顺序-矩阵和四元数乘法是顺序依赖的。我建议:
通常情况下,你想先做你的偏航,然后是你的投球,然后是你的滚动(或者如果你愿意的话,你可以完全跳过滚),但我不记得是从旁开始的,不管是osg::quat,以一种前、后的方式连接起来,所以它可以是p-r-y顺序。
https://stackoverflow.com/questions/50929527
复制相似问题