0

我需要在我的场景图中添加一堵墙,让它工作,这样我就不能用我的相机越过墙。我正在创建一个实验室场景,但总的来说我对 3d 编程很陌生。我一直在使用 OpensceneGraph 3.0 Beginner's guide 这本书,到目前为止,好的。

我的场景中有几件家具,但我想做的是添加一堵墙,我的相机不应该越过它。我下面的代码,来自本书,Openscenegraph 初学者,似乎没有做任何事情(第 83 页)。我添加了它,我没有看到一堵墙,我仍然可以用我的相机在场景中的任何地方移动。如何在我的应用程序中创建墙。

osg::ref_ptr<osg::Group> root = new osg::Group();
    //adding walls to the lab to make it more room like -- 7/6/12
    osg::ref_ptr<osg::Vec3Array> vertices = new osg::Vec3Array;
    vertices->push_back(osg::Vec3(0.0f, 0.0f, 0.0f));
    vertices->push_back(osg::Vec3(0.0f, 0.0f, 1.0f));
    vertices->push_back(osg::Vec3(1.0f, 0.0f, 0.0f));
    vertices->push_back(osg::Vec3(1.0f, 0.0f, 1.5f));
    vertices->push_back(osg::Vec3(2.0f, 0.0f, 0.0f));
    vertices->push_back(osg::Vec3(2.0f, 0.0f, 1.0f));
    vertices->push_back(osg::Vec3(3.0f, 0.0f, 0.0f));
    vertices->push_back(osg::Vec3(3.0f, 0.0f, 1.5f));
    vertices->push_back(osg::Vec3(4.0f, 0.0f, 0.0f));
    vertices->push_back(osg::Vec3(4.0f, 0.0f, 1.0f));

    osg::ref_ptr<osg::Vec3Array> normals = new osg::Vec3Array;
    normals->push_back(osg::Vec3(0.0f, -1.0f, 0.0f));

    osg::ref_ptr<osg::Geometry>geom = new osg::Geometry;
    geom->setVertexArray(vertices.get());
    geom->setNormalArray((normals.get()));
    geom->setNormalBinding((osg::Geometry::BIND_OVERALL));
    geom->addPrimitiveSet((new osg::DrawArrays(GL_QUAD_STRIP,0,10)));
    osg::ref_ptr<osg::Geode> wall = new osg::Geode;
    wall->addDrawable(geom.get());
    root->addChild(wall);

osgViewer::Viewer viewer;
      viewer.setSceneData(root.get());
    viewer.run();
4

1 回答 1

2

您已经按照上面的代码绘制了“墙”——它看起来更像是栅栏而不是墙,但是您可以通过将 1.0 值一直移动到 1.5 以匹配其他值来轻松解决这个问题。由于比例不同,您可能无法在场景的其余部分看到它 - 例如,如果您的家具尺寸为 100 秒。用以下代码替换您的 root->addChild(wall):

 // assumes your furniture is already added to root
 float scale=root->getBound().radius();
 osg::ref_ptr<osg::PositionAttitudeTransform> pax = new osg::PositionAttitudeTransform;
 pax->addChild(wall);
 pax->setScale(osg::Vec3d(scale,scale,scale));
 root->addChild(pax);

然后你会看到你的栅栏。移动 pax 的位置/旋转以放置墙壁。正如我在评论中提到的那样,您必须使用一些交叉路口代码来告诉相机在哪里停下来。

于 2012-07-12T16:33:00.073 回答