0

シーングラフに壁を追加して、カメラで壁を通り過ぎないようにする必要があります。私は実験室のシーンを作成していますが、3D プログラミング全般は初めてです。私は OpensceneGraph 3.0 ビギナーズ ガイドという本を使用してきましたが、これまでのところ、わかりました。

シーンに家具がいくつかありますが、やりたいことは、カメラがそれを越えてはならない壁を追加することです。本、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 に答える