查看: 2253|回复: 7

osg中使用回调改变顶点Alpha值 实现一个渐变过程

[复制链接]

该用户从未签到

发表于 2009-7-14 17:31:12 | 显示全部楼层 |阅读模式
我首先定义一个回调函数
template<typename T>
class UpdateCallback: public osg::NodeCallback
{
public:      
        UpdateCallback(T* node):m_node(node)
        {};
        virtual void operator()(osg::Node* node, osg::NodeVisitor* nv)
        {
                if (m_node)
                {
                        m_node->update();
                }
                traverse(node,nv);
        }
public:
        T* m_node;
};


再在
class Flower:public osg::MatrixTransform
{
       osg::Vec4Array* m_colors;
        osg::Geode*createFlower(const osg::Vec3& corner,const osg::Vec3&  width,const osg::Vec3& height);
Flower(float xx,float yy)
        {
                m_colors = new osg::Vec4Array(4);                                          this->setUpdateCallback( new UpdateCallback<Flower>(this));
               
        }
        void update();

      
}


void Flower::update()
{
        osg::Vec4Array& colors=*m_colors;
        if (n_aphor<1.0f)
        {
                n_aphor=n_aphor+0.01;
                for (int i=0;i<colors.size();i++)
                {
                        colors[i] = osg::Vec4(1, 1, 1,n_aphor);
                }
        }
}

再在创建图元里面吧颜色传出来


          osg::Vec4Array* colors = new osg::Vec4Array(4);

        colors->push_back(osg::Vec4(1.0f, 0.0f, 0.0f, 0));
        colors->push_back(osg::Vec4(1.0f, 0.0f, 0.0f, 0));
        colors->push_back(osg::Vec4(1.0f, 0.0f, 0.0f, 0));
        colors->push_back(osg::Vec4(0.0f, 0.0f, 0.0f, 0));
        //aphor=m_aphor;
       
        colors=m_colors;

怎么改变不了Alpha值

其他步骤没错

该用户从未签到

发表于 2009-7-14 23:42:46 | 显示全部楼层
我无法从现有的代码中判断什么。您可以检查是否Alpha的设置已经生效,还有改变数据之后要执行dirtyDisplayList()

该用户从未签到

 楼主| 发表于 2009-7-15 10:36:37 | 显示全部楼层
刚调试了
update()函数是有效的
发现问题了
就是他一直都在update()里面 运行
  osg::Vec4Array& colors=*m_colors;
        if (n_aphor<1.0f)
        {
                n_aphor=n_aphor+0.01;
                for (int i=0;i<colors.size();i++)
                {
                        colors[i] = osg::Vec4(1, 1, 1,n_aphor);
                }
        }
根本没有出来

不是我n_aphor值 加一次 回到设置颜色数组绑定吗?

该用户从未签到

发表于 2009-7-15 10:48:27 | 显示全部楼层
一直没有出来?

从您的update()代码看来是不可能的,不知您是否把什么重要的代码段给省去了?这是程序逻辑的问题,请您仔细排查一下

该用户从未签到

 楼主| 发表于 2009-7-15 13:14:35 | 显示全部楼层
谢谢王锐
问题解决了
我用的dirtyDisplayList()函数后
更新里面就跳出来了
dirtyDisplayList()函数有什么用
dirtyDisplayList()函数到底是怎么去实现的这种功能

再次麻烦了

该用户从未签到

发表于 2009-7-15 16:23:37 | 显示全部楼层
“我用的dirtyDisplayList()函数后,更新里面就跳出来了”

这显然和dirtyDisplayList()没有关系,您需要再检查。

这个函数的工作是指示重新编译显示列表,因此重新更改过的colors内容会应用到几何体上;但是,事实上有动画效果的几何体不适合使用显示列表来管理,建议关闭显示列表,使用VBO或者慢速路径来实现,此时就用不着dirtyDisplayList()了

该用户从未签到

 楼主| 发表于 2009-7-15 17:39:02 | 显示全部楼层
这个函数的工作是指示重新编译显示列表,因此重新更改过的colors内容会应用到几何体上

我表述有点问题,
我的意思就是这样的 .

该用户从未签到

 楼主| 发表于 2009-7-15 17:39:44 | 显示全部楼层
谢谢锐哥
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

联系我们

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