5

编写一个小的openscenegraph 应用程序,并且需要一种方法来改变Camera 的高度。本质上,眼睛是直视空间中的球。我想要做的是能够降低相机高度,这样我就可以从下方击球,如果需要,还可以提高相机高度。如何使用 oPengl 代码或 OpenScenegraph 实现这一目标?

int main(int argc, char* argv[])
{ 
    osg::ref_ptr<osg::ShapeDrawable> shape2 = new osg::ShapeDrawable; 
    shape2->setShape( new osg::Sphere(osg::Vec3(3.0f, 0.0f, 0.0f),1.0f) ); 
    shape2->setColor( osg::Vec4(0.0f, 0.0f, 1.0f, 1.0f) ); 
    osg::ref_ptr<osg::Geode> root = new osg::Geode; 
    root->addDrawable( shape2.get() );///add first osgshapeDrawable2  
    osgViewer::Viewer viewer;
    viewer.setSceneData( root.get() );///set the Geode as scenedata for the viewer
    return viewer.run();
}
4

2 回答 2

2

您需要接管对 的控制osgViewer::Camera,您不应该尝试使用基本的 OpenGL 来执行此操作。

osgViewer::Viewer::getCameraWithFocus应该给你相机。从这里您可以设置相机的位置和外观。

请记住,在像您这样的基本应用程序中,相机操纵器每帧设置一次相机的位置(基于鼠标交互)。

您将需要决定如何处理鼠标输入,并可能接管 Camera Manipulator 正在执行的任务。

于 2012-12-12T22:46:54.797 回答
0

在您的 Camera 对象上使用setViewMatrixAsLookAt方法(链接)。该方法接受三个参数:

  • eye:您的相机的位置 - 您可以使用它来设置它的高度。
  • center:您的相机正在查看的点 - 将其设置为观察对象的中心。
  • up: 相机的上矢量 - 这控制视口如何围绕其中心旋转,并且在传统图形坐标系中应等于 [0, 1, 0]。

因为这个方法通过指定它正在寻找的点来处理相机的旋转,所以你应该只修改eye向量的 y 坐标来完成你所要求的。

您可以在此处查看有关“查看”矢量三元组的更多详细信息。

于 2012-12-27T00:51:12.613 回答