在场景中的某个点周围旋转相机,同时查看不同的点

时间:2015-06-18 04:57:43

标签: 3d openscenegraph coordinate-transformation perspectivecamera

这是问题陈述:

我试图在Open scene graph设置我的相机,以便它看到给定的点但是当我旋转它时(使用trackballmanipulator),它应该围绕太空中不同的旋转中心。

所以基本上相机看着一个点,但在场景中的不同点周围旋转。

现在从我的研究到目前为止我收集到了我需要在我的相机中应用一些transformations。但我不太明白我应该申请transformations

有人可以帮我数学吗?我还在努力学习CG数学。

我有以下信息:

eye (camera position): (eyeX, eyeY, eyeZ)

center (model center): (refX, refY, refZ)

up : (upX, upY, upZ)

Spin center/spin axis: (spinX, spinY, spinZ)

代码段:

osg::Vec3d eye = osg::Vec3d(cameraPos.at(0), cameraPos.at(1), cameraPos.at(2));

osg::Vec3d viewVector = osg::Vec3d(cameraViewDirection.at(0), cameraViewDirection.at(1), cameraViewDirection.at(2));

osg::Vec3d up = osg::Vec3d(cameraUpDirection.at(0), cameraUpDirection.at(1), cameraUpDirection.at(2));

osg::Vec3d modelCenter(eye + viewVector);

osgGA::CameraManipulator *cameraManipulator = view->getCameraManipulator();
osgGA::TrackballManipulator *trackBallManipulator = dynamic_cast<osgGA::TrackballManipulator *>(cameraManipulator);dynamic_cast<osgGA::TrackballManipulator *>(cameraManipulator);

//Transform camera values??

//Apply the viewpoint

trackBallManipulator->setTransformation(transformedEye, transformedCenter, transformedUp);

1 个答案:

答案 0 :(得分:1)

您可以为轨迹球操纵器定义原点位置。这是当按下空格或使用操纵器的home(double time)功能时操纵器将返回的位置和方向。

使用三个向量定义该原始位置;眼睛,中心和向上。

  • 眼睛 - 相机所在的世界。
  • 中心 - 相机指向世界的哪个点。
  • 向上 - 单位矢量定义摄像机正面的方向。

假设我们在坐标(1.0, 1.0, 0.0)处有一个物体,我们希望轨迹球操纵器将其用作旋转中心。我们希望相机的位置有点向上和向上,因此我们将其定义为(0.0, 5.0, -10.0)的眼睛向量,即5个单位向上和10个单位向后。最后我们希望摄像机的向上方向与Y轴对齐,然后向上矢量将为(0.0, 1.0, 0.0)

一个小代码片段可能如下所示:

// Create a new Trackball manipulator
osg::ref_ptr<osgGA::TrackballManipulator> manipulator = new osgGA::TrackballManipulator;
// Connect the trackball manipulator to the viewer
viewer.setCameraManipulator(manipulator);

// Set the desired home coordinates for the manipulator
osg::Vec3d eye(0.0, 5.0, -10.0);
osg::Vec3d center(1.0, 1.0, 0.0);
osg::Vec3d up(0.0, 1.0, 0.0);

// Make sure that OSG is not overriding our home position
manipulator->setAutoComputeHomePosition(false);
// Set the desired home position of the Trackball Manipulator
manipulator->setHomePosition(eye, center, up);
// Force the camera to move to the home position
manipulator->home(0.0);

// Start Viewer
while (!viewer.done()) {
    viewer.run();
}