查看: 4918|回复: 9

光源的位置和透明度的问题

[复制链接]

该用户从未签到

发表于 2008-4-2 14:32:47 | 显示全部楼层 |阅读模式
光源的位置除了用matrixtransform外,还有别的方法吗?
为什么我使用Light的setPosition不好用呢?

透明度除了Material 中的setTransparency外还有别的方法吗?
刚上面一样,没有反应。

[ 本帖最后由 lawn 于 2008-4-2 14:37 编辑 ]

该用户从未签到

发表于 2008-4-2 14:53:54 | 显示全部楼层
光源得有参照才行,不会没有效果的~~~~~~~~~~~~~~~
  • TA的每日心情
    开心
    2019-11-11 10:36
  • 签到天数: 2 天

    [LV.1]初来乍到

    发表于 2008-4-2 15:39:04 | 显示全部楼层
    使用光源一般要有效果最少也得使用法线才中,所以这是最最最其码的要求~~~
  • TA的每日心情
    开心
    2019-11-11 10:36
  • 签到天数: 2 天

    [LV.1]初来乍到

    发表于 2008-4-2 15:39:29 | 显示全部楼层
    光源的位置是可以TRANSFORM的,可能你哪里没搞好

    该用户从未签到

    发表于 2008-4-2 15:47:36 | 显示全部楼层
    原帖由 lawn 于 2008-4-2 14:32 发表
    光源的位置除了用matrixtransform外,还有别的方法吗?
    为什么我使用Light的setPosition不好用呢?

    透明度除了Material 中的setTransparency外还有别的方法吗?
    刚上面一样,没有反应。


    光源LightSource必须有相应的灯光实例Light,而这个灯光实例也必须作为节点树的渲染属性存在,即对节点树根节点的StateSet指定了setAttribute或相关函数。单纯的LightSource没有意义,类似的还有TexGenNode和ClipNode。
    至于透明度的指定,个人认为也可以考虑使用AlphaFunc和BlendFunc。而Material渲染属性如果没有对应的灯光Light的话,也是没有意义的。您可以检查一下Light灯光属性的设置是否正确

    该用户从未签到

     楼主| 发表于 2008-4-8 15:42:52 | 显示全部楼层
    原帖由 array 于 2008-4-2 15:47 发表


    光源LightSource必须有相应的灯光实例Light,而这个灯光实例也必须作为节点树的渲染属性存在,即对节点树根节点的StateSet指定了setAttribute或相关函数。单纯的LightSource没有意义,类似的还有TexGenNode和Cli ...


    变换光源位置我不想用matrixtransform,light不是有setposition吗,我在lightsource上加了更新回调,希望通过light::setposition参数的动态修改来改变位置。
    但是实际结果是参数变了,但是光源位置没变。
    我用matrixtransform,可以实现光源位置的改变,但是我不知道该怎么样改变light的属性。
    有没有什么好的方法呢?

    该用户从未签到

    发表于 2008-4-8 18:16:06 | 显示全部楼层

    回复 楼主 的帖子

    设置光源的位置不止一个简单的Light的setPosition函数就能解决的,还要设置一些其它的东西。具体的你可以参考osglight这个例子。

    该用户从未签到

    发表于 2008-4-8 18:32:01 | 显示全部楼层
    原帖由 lawn 于 2008-4-8 15:42 发表


    变换光源位置我不想用matrixtransform,light不是有setposition吗,我在lightsource上加了更新回调,希望通过light::setposition参数的动态修改来改变位置。
    但是实际结果是参数变了,但是光源位置没变。
    我用 ...


    呵呵,用LightSource的做法肯定是正确地,至于为什么不能setPosition~~能否再提供一些代码参考呢?

    该用户从未签到

     楼主| 发表于 2008-4-8 19:59:45 | 显示全部楼层
    原帖由 array 于 2008-4-8 18:32 发表


    呵呵,用LightSource的做法肯定是正确地,至于为什么不能setPosition~~能否再提供一些代码参考呢?


    添加光源的代码是:   lightnum=0;
                    osg::ref_ptr<osg:ight> light=new osg::Light;
                    light->setLightNum(lightnum);
                    light->setPosition(osg::Vec4(0.f,0.f,0.f,1.f));
                    light->setDirection(osg::Vec3(1.f,0.f,0.f));
                    light->setSpotCutoff(25.f);
                    osg::ref_ptr<osg::LightSource> ls=new osg::LightSource;
                    ls->setDataVariance(osg::Object:YNAMIC);
                    ls->setUpdateCallback(new lightCB);
                    ls->setLight(light.get());
                    mRoot->addChild(ls.get());
                      lightnum++;
    更新回调:
    void lightCB:perator()(osg::Node* node,osg::NodeVisitor* nv)
    {
           CMainFrame *pFrame = (CMainFrame *)AfxGetApp()->m_pMainWnd;
           osg::LightSource * ls=dynamic_cast<osg::LightSource *>(node);
           osg::Light * lt=ls->getLight();
           lt->setAmbient(osg::Vec4((float)GetRValue(ambient)/255.0f,(float)GetGValue(ambient)/255.0f,(float)GetBValue(ambient)/255.0f,0.f));
           lt->setSpecular(osg::Vec4((float)GetRValue(specular)/255.0f,(float)GetGValue(specular)/255.0f,(float)GetBValue(specular)/255.0f,0.f));
           lt->setDiffuse(osg::Vec4((float)GetRValue(diffuse)/255.0f,(float)GetGValue(diffuse)/255.0f,(float)GetBValue(diffuse)/255.0f,0.f));
           lt->setPosition(osg::Vec4(m_lpxing,m_lpying,m_lpzing,1.f));
           lt->setDirection(osg::Vec3(m_ldxing,m_ldying,m_ldzing));
           lt->setSpotCutoff(m_raing);
           lt->setSpotExponent(m_dring) ;
                     
                     //外部传入的参数   问题是外部参数发生改变了,但是光源的属性没有发生变化
                    ambient=pFrame->ambientm;
                    specular=pFrame->specularm;
                    diffuse=pFrame->diffusem;
                    m_ldaxing=pFrame->m_ldaxingm;
                    m_ldaying=pFrame->m_ldayingm;
                    m_ldazing=pFrame->m_ldazingm;
                    m_ldxing=pFrame->m_ldxingm;
                    m_ldying=pFrame->m_ldyingm;
                    m_ldzing=pFrame->m_ldzingm;
                    m_raing=pFrame->m_raingm;
                    m_dring=pFrame->m_dringm;
                    m_lpxing=pFrame->m_lpxingm;    //位置x
                    m_lpying=pFrame->m_lpyingm;    //位置y
                    m_lpzing=pFrame->m_lpzingm;    //位置z

            traverse(node,nv);
    }

    该用户从未签到

    发表于 2008-4-9 09:25:56 | 显示全部楼层

    回复 9楼 的帖子

    ls->setDataVariance(osg::ObjectYNAMIC);

    这句设置你回调要修改的对象,但回调中却在主要修改light,是不是对light也要加上类似上面的一句?
    您需要登录后才可以回帖 登录 | 注册

    本版积分规则

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

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

    联系我们

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