osg::ComputeBoundsVisitor用法(一)

博客介绍了osg::ComputeBoundsVisitor可用于获取模型或绘制几何体的最小包围盒,给出获取cow.osg模型最小包围盒中心点及x、y、z坐标最大、最小值的示例,还提醒输出信息时要加回车换行,避免日志信息只存于缓冲区。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

osg::ComputeBoundsVisitor用于获取模型或绘制几何体的最小包围盒。如下代码:


#include<osg/Geometry>
#include<osg/Geode>
#include<osgViewer/Viewer>
#include<osgViewer/ViewerEventHandlers>
#include <osg/Node>
#include <osg/Geode>
#include <osg/Group>
#include <osgViewer/Viewer>
#include <osgDB/ReadFile>
#include <osgDB/WriteFile>
#include<osg/DrawPixels>
#include<osg/PositionAttitudeTransform>
#include<osg/computeBoundsVisitor>
#include<osg/MatrixTransform>
#include<osg/ShapeDrawable>
#include<osg/Shape>
#include<osg/PolygonMode>
int main(int argc, char *argv[])
{
	osg::ref_ptr<osgViewer::Viewer> spViewer = new osgViewer::Viewer();
	osg::ref_ptr<osg::Group> spGroup = new osg::Group();

	osg::ref_ptr<osg::Node> spNode = osgDB::readNodeFile("cow.osg");
	spGroup->addChild(spNode);
	spViewer->setSceneData(spGroup);
	osg::ComputeBoundsVisitor boundsVist;
	spNode->accept(boundsVist);

	osg::BoundingBox box = boundsVist.getBoundingBox();
	//OSG_NOTIFY(osg::ALWAYS) << "bound info:" << std::endl;;
	osg::notify(osg::ALWAYS) << "bouding box info" << std::endl;
	osg::notify(osg::ALWAYS) << "center x:" << box.center().x() << std::endl;
	osg::notify(osg::ALWAYS) << "center y:"<< box.center().y() << std::endl;;
	osg::notify(osg::ALWAYS) << "center z:" << box.center().z() << std::endl;;
	osg::notify(osg::ALWAYS) << "x max:" << box.xMax() << std::endl;
	osg::notify(osg::ALWAYS) << "x min:" << box.xMin() << std::endl;
	osg::notify(osg::ALWAYS) << "y max:" << box.yMax() << std::endl;
	osg::notify(osg::ALWAYS) << "y min:" << box.yMin() << std::endl;
	osg::notify(osg::ALWAYS) << "z max:" << box.zMax() << std::endl;
	osg::notify(osg::ALWAYS) << "z min:" << box.zMin() << std::endl;

	// 画个外框
	osg::ref_ptr<osg::Geode>spGeodeBox = new osg::Geode();
	spGeodeBox->addDrawable(new osg::ShapeDrawable(new osg::Box(box.center(), box.xMax() - box.xMin(), box.yMax() - box.yMin(), box.zMax() - box.zMin())));
	osg::ref_ptr<osg::StateSet> spGeodeStateSet = spGeodeBox->getOrCreateStateSet();
	
   // 采用线框模式,以便能看见里面的模型即cow.osg
    osg::ref_ptr<osg::PolygonMode> spGeodePolygon = new osg::PolygonMode(osg::PolygonMode::FRONT_AND_BACK, osg::PolygonMode::LINE);
	spGeodeStateSet->setAttribute(spGeodePolygon);
	spGroup->addChild(spGeodeBox);
	spViewer->setUpViewInWindow(10, 10, 800, 600);
	spViewer->realize();
	spViewer->run();
    return 0;
}

获取cow.osg模型最小包围盒的中心点及x、y、z坐标的最大、最小值,输入如下:

注意:上面的osg::notify(osg::ALWAYS)输出信息时,后面要加回车换行,否则日志信息只输入到缓冲区,而不会立即输出到控制台

模型显示效果如下:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值