查看: 918|回复: 3

osg中如何将一个.osg模型放到另一个.osg模型上(两者没有折叠)

[复制链接]

该用户从未签到

发表于 2015-1-28 10:26:25 | 显示全部楼层 |阅读模式
osg中如何将一个.osg模型放到另一个.osg模型上(两者没有折叠)

该用户从未签到

发表于 2015-1-28 11:08:33 | 显示全部楼层
计算两个模型的包围盒osg::BoundingBox,将要移动的模型放到osg::MatrixTransform节点中,并将其包围盒的底部中心移动到另一个模型的顶部中心

该用户从未签到

 楼主| 发表于 2015-3-25 17:02:20 | 显示全部楼层
anlingbin 发表于 2015-1-28 11:08
计算两个模型的包围盒osg::BoundingBox,将要移动的模型放到osg::MatrixTransform节点中,并将其包围盒的底 ...

有没有什么实现的代码,我是一个初学者,刚开始什么都不是太清楚。。。

该用户从未签到

发表于 2015-3-26 12:32:05 | 显示全部楼层
大概是这样:

int _tmain(int argc, char* argv[])
{
        std::string topFile = "E:/alb/model/RevitExport/cvx.ive";//"top.osg";
        std::string bottomFile = "E:/alb/model/RevitExport/cvx.ive";//"bottom.osg";

        osg::ref_ptr<osg::Node> topNode = osgDB::readNodeFile(topFile);
        osg::ref_ptr<osg::Node> bottomNode = osgDB::readNodeFile(topFile);

        osg::ComputeBoundsVisitor cbvtop;
        topNode->accept(cbvtop);
        osg::BoundingBox topBox = cbvtop.getBoundingBox();

        osg::ComputeBoundsVisitor cbvbot;
        bottomNode->accept(cbvbot);
        osg::BoundingBox botBox = cbvbot.getBoundingBox();

        osg::Vec3 trans(topBox.center() - botBox.center());
        trans.z() = botBox.zMax() - topBox.zMin();
        osg::MatrixTransform* mt = new osg::MatrixTransform(osg::Matrix::translate(trans));
        mt->addChild(topNode);

        osg::Group* root = new osg::Group;
        root->addChild(mt);
        root->addChild(bottomNode);

        //osg:ightModel* lightModel = new osg::LightModel;
        //lightModel->setTwoSided(true);//双面灯光
        //node->getOrCreateStateSet()->setAttribute(lightModel);

        osgViewer::Viewer viewer;
        //viewer.setSceneData(node.get());
        viewer.setSceneData(root);
        viewer.setUpViewInWindow(100, 100, 800, 600);
        return viewer.run();
}
您需要登录后才可以回帖 登录 | 注册

本版积分规则

OSG中国官方论坛-有您OSG在中国才更好

网站简介:osgChina是国内首个三维相关技术开源社区,旨在为国内更多的技术开发人员提供最前沿的技术资讯,为更多的三维从业者提供一个学习、交流的技术平台。

联系我们

  • 工作时间:09:00--18:00
  • 反馈邮箱:1315785073@qq.com
快速回复 返回顶部 返回列表