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
后面(它适用于我的模型))吗?
谢谢:)
这可能只是您的旋转顺序 - 矩阵和四元数乘法取决于顺序。我会建议:
- 尝试在 MakeRotate 调用中调换俯仰和滚动的顺序。
- 如果这不起作用,一次将除 1 个旋转之外的所有旋转设置为 0°,确保每个都是您所期望的,然后您可以玩这些命令(只有 6 个可能的命令)。
- 您还可以制作单独的四元数 q1、q2、q3,其中每个分别代表 h、p 和 r,然后自己将它们相乘以控制顺序。这就是您正在使用的 MakeRotate 重载在幕后所做的事情。
通常你想先做偏航,然后是俯仰,然后是翻滚(如果你愿意,也可以完全跳过翻滚),但我不记得 osg::quat 是否在 pre 中连接-mult 或 post-mult 时尚,所以它可以是 p-r-y 顺序。
过去,我做过一个可爱的技巧,涉及使用 ObjectLocator 对象(获取世界位置和平面切线到表面的方向),结合矩阵来应用 HPR。那里有一个反转使其成为相机方向矩阵而不是对象放置矩阵,但它工作正常。
要查看您的代码片段中发生了什么有点棘手,因为许多变量的类型并不明显。
AlphaPixel 做了很多遥测/osgEarth 类型的事情,如果您需要帮助,请大声说出来。
我正在使用 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
后面(它适用于我的模型))吗?
谢谢:)
这可能只是您的旋转顺序 - 矩阵和四元数乘法取决于顺序。我会建议:
- 尝试在 MakeRotate 调用中调换俯仰和滚动的顺序。
- 如果这不起作用,一次将除 1 个旋转之外的所有旋转设置为 0°,确保每个都是您所期望的,然后您可以玩这些命令(只有 6 个可能的命令)。
- 您还可以制作单独的四元数 q1、q2、q3,其中每个分别代表 h、p 和 r,然后自己将它们相乘以控制顺序。这就是您正在使用的 MakeRotate 重载在幕后所做的事情。
通常你想先做偏航,然后是俯仰,然后是翻滚(如果你愿意,也可以完全跳过翻滚),但我不记得 osg::quat 是否在 pre 中连接-mult 或 post-mult 时尚,所以它可以是 p-r-y 顺序。
过去,我做过一个可爱的技巧,涉及使用 ObjectLocator 对象(获取世界位置和平面切线到表面的方向),结合矩阵来应用 HPR。那里有一个反转使其成为相机方向矩阵而不是对象放置矩阵,但它工作正常。
要查看您的代码片段中发生了什么有点棘手,因为许多变量的类型并不明显。
AlphaPixel 做了很多遥测/osgEarth 类型的事情,如果您需要帮助,请大声说出来。