我需要在我的场景图中添加一个墙,并让它工作,所以我不能用相机穿过墙。我正在创建一个实验室场景,但我不熟悉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();
答案 0 :(得分:2)
你已经按照上面的编码绘制了“墙” - 它看起来更像栅栏而不是墙壁,但你可以通过将1.0值一直移动到1.5以匹配其他值来轻松解决这个问题。例如,如果您的家具尺寸为100,那么您可能无法在场景的其余部分看到它。使用以下代码替换root-&gt; 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的位置/旋转以放置墙壁。正如我在评论中提到的那样,你必须使用一些交叉码来告诉摄像机停在哪里。