查看: 828|回复: 2

求助Array大神一个问题

[复制链接]

该用户从未签到

发表于 2014-5-29 10:49:45 | 显示全部楼层 |阅读模式
本帖最后由 libei278214081 于 2014-5-29 16:46 编辑

Array每次都能回答我的问题,希望也能帮我解决下面的问题,有点长,谢谢了

还是那个问题:
         
            问题描述:我想画一个圆柱把人的骨架给包围住,人动的时候圆柱和跟着动。

于是:
              我在person这个类的构造函数中,初始化了一个group节点,下面挂接14个matrixtransform节点,每个matrixtransform节点下面再挂接了1个geode节点,每个geode节点下面各自挂接了osg里带的圆柱体:
        for ( int i = 0 ; i < 14 ; i++ )
        {
                osg::ref_ptr <osg::Cylinder> cylinder = new osg::Cylinder(osg::Vec3(0.0,0.0,0.0),0.01,0.5);
                osg::ref_ptr <osg::ShapeDrawable> dcylinder = new osg::ShapeDrawable(cylinder);
                mdpt_geode->addDrawable(dcylinder);
                 //接着下面是把节点addchild到上一级节点
        }

然后我写了一个更新的矩阵的方法,是在回调函数调用的,每次求得变换矩阵,就调用更新的操作
osg::MatrixTransform *u_mt = dynamic_cast<osg::MatrixTransform *>(mPerson -> getChild(i));
                        u_mt -> setMatrix(u_m);
                }
                updatePerson(mPerson,h0);  //更新操作

接下来是更新,我想变化圆柱体的参数,于是我从新求了一次它的中点和两个相连节点的距离,然后通过set方法重新设置了参数
for ( int i = 0 ; i < 14 ; i++ )
        {
                ((osg::Cylinder*)(mOSG->getNodeByName(mPerson,geoname)-> asGeode()
                -> getDrawable(0) -> getShape()))->set(middlePoint,0.1,distance);
        }


现在有2个问题:
1、不知道上面的步骤有没有错,听Array大神说在更新操作里加dirtybound?
2、第二个关键问题是,为了不想初始化时候让别人看到圆柱,等有新数据,我才显示数据。于是,构造函数里,我根节点设置了setnodemask(0),这样确实是调用了更新操作,但是结果不对,大小可以变,长度可以变,但是中心点不对,难道是因为setnodemask(0)不应该放在构造函数里吗,如果我setnodemask(1)的话,结果是只调用了构造函数的初始化的圆柱体,而修改的圆柱体是不改变的,包括大小,中心点,距离啊。
                       
怎么求解。。。

该用户从未签到

发表于 2014-6-25 16:43:00 | 显示全部楼层
不是已经回答过是dirtyBound和dirtyDisplayList么,默认用显示列表构建的对象发生形体变化时,需要重新建立显示列表,而包围体的更新可以确保远近平面计算的正确
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

联系我们

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