查看: 2781|回复: 7

3D模型重叠问题和改变颜色问题~~~~求助

[复制链接]

该用户从未签到

发表于 2012-4-11 14:05:57 | 显示全部楼层 |阅读模式
1. 如何实现模型叠加,我加载了两个3D模型,一个模型比较大而且实现半透明,另一个模型比较小,在物理上小模型是在大模型的内部,但是加载的时候我分开加载,是否能实现把小模型放到大模型内部的效果?请问怎么实现?只是单一的设置小模型的坐标位置可以实现?我尝试过,但是发现模型之间始终有距离,不知道是不是我的坐标设置有问题?请指教
2. 加载3D模型,鼠标点击某个模型,改变模型的颜色,这个问题我没有找到答案,所以请指点

该用户从未签到

发表于 2012-4-12 10:02:59 | 显示全部楼层
1. 经典的透明排序会很麻烦,大模型必须拆开并保证不会有自交叉的情况,或者您可以考虑depth peeling这种OIT的方案
2、这有什么复杂的?求交,找到geometry,设置material或者colorarray即可

该用户从未签到

 楼主| 发表于 2012-4-12 12:52:56 | 显示全部楼层
array 发表于 2012-4-12 10:02
1. 经典的透明排序会很麻烦,大模型必须拆开并保证不会有自交叉的情况,或者您可以考虑depth peeling这种OI ...

osg::Geometry *geom = dynamic_cast<osg::Geometry*>(np);
if(NULL != geom)
{
    if(!geom->empty())
    {
         geom->setColorArray(colors);
         //geom->setColorBinding(osg::Geometry::BIND_PER_PRIMITIVE);
    }
}
我尝试了,获取到的没有Geometry ,是一些其他类型的节点,所以指针是空

该用户从未签到

发表于 2012-4-13 10:03:38 | 显示全部楼层
您都没有说明自己的np是什么,别人如何进行判断

该用户从未签到

 楼主| 发表于 2012-4-13 10:31:17 | 显示全部楼层
array 发表于 2012-4-13 10:03
您都没有说明自己的np是什么,别人如何进行判断

np是求交之后的nodePath

该用户从未签到

 楼主| 发表于 2012-4-13 10:35:20 | 显示全部楼层
array 发表于 2012-4-13 10:03
您都没有说明自己的np是什么,别人如何进行判断

我现在能做到的是: 把材质改变了一下,我点击模型之后,模型变暗,但是我想做的效果是,点击模型之后,整个模型变成红色,或者绿色。下面是我的代码,请帮忙看一下。
        osgUtil:ineSegmentIntersector::Intersections intersections;
        float x = ea.getX();
        float y = ea.getY();


        if(Viewer->computeIntersections(x,y,intersections))
        {
               
                for(osgUtil::LineSegmentIntersector::Intersections::iterator hitr = intersections.begin();hitr != intersections.end(); ++hitr)
                {

                        if(!hitr->nodePath.empty() && !(hitr->nodePath.back()->getName().empty()))
                        {
                                const osg::NodePath &np = hitr->nodePath;
                                for(int i = np.size()-1; i >= 0; --i)
                                {

                                        string stra = np->className();

                                        //osg::Node *node = dynamic_cast<osg::Node*>(np);
                                        osg::Geode *geode = dynamic_cast<osg::Geode*>(np);
                                        string str = "";
                                        if(geode != NULL)
                                        {
                                                str = geode->getName();
                                        }
                                       
                                        if("Asm Machine2"== str && geode != NULL)
                                        {
                                                //osg::Vec4Array* colors = new osg::Vec4Array;
                                                //colors->push_back(osg::Vec4(0.0f,1.0f,0.0f,1.0f));
                                                osg::Geometry *geom = new osg::Geometry();
                                                geom->setName("Geometry1");
                                                geom->setColorArray(colors);
                                                geom->setColorBinding(osg::Geometry::BIND_OVERALL);
                                                geode->addDrawable(geom);
                                                osg::Material *mat2 = new osg::Material();
                                                mat2->setColorMode(osg::Material::ColorMode:IFFUSE);
                                                osg::StateSet *stateset3 = geom->getOrCreateStateSet();
                                                geode->setStateSet(stateset3);
                                                stateset3->setAttribute(mat2);
                                                geode->getOrCreateStateSet()->setMode(GL_RESCALE_NORMAL,osg::StateAttribute::ON);
                                        }
                                }
                        }
                }
        }

该用户从未签到

 楼主| 发表于 2012-4-13 11:17:33 | 显示全部楼层
array 发表于 2012-4-13 10:03
您都没有说明自己的np是什么,别人如何进行判断

谢谢Array,点击模型改变其颜色这个问题已经解决。还有一个问题就是,怎么加载小模型到大模型的内部,大模型已经是半透明的,通过设置坐标可以吗?

该用户从未签到

发表于 2012-4-17 09:51:30 | 显示全部楼层
设置小模型的位置就可以了
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

联系我们

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