查看: 1512|回复: 4

请教灯光中出现的问题?

[复制链接]

该用户从未签到

发表于 2012-4-12 16:36:57 | 显示全部楼层 |阅读模式
本帖最后由 bdaabaa3b2a8 于 2012-4-12 16:40 编辑

        我参照OSG light例子想写个实现车灯的程序,我看了论坛里的帖子,大体思路是这样的:我用Creator创建了一个圆柱体的模型(暂且用圆柱体模拟),模型的透明度设置为0.2,然后加入场景在加入聚光灯,程序如下:;但是,我没有得到灯光的效果。我自己感觉是没有求出模型的法线,可能还有别的问题,希望大家帮帮我看看哪里出问题了,最主要的是加载的模型节点各面的法线怎么求得。?十分感谢~~
osg::Node* createLights(osg::StateSet* rootStateSet)
{
    osg::Group* lightGroup = new osg::Group;
    // create a spot light.
    osg:: Light* myLight1 = new osg::  Light;
    myLight1->setLightNum(0);
    myLight1->setPosition(osg::Vec4(0.0f,0.0f,0.0f,1.0f));
    myLight1->setAmbient(osg::Vec4(1.0f,0.0f,0.0f,1.0f));
    myLight1->setDiffuse(osg::Vec4(1.0f,0.0f,0.0f,1.0f));
    myLight1->setSpotCutoff(20.0f);
    myLight1->setSpotExponent(50.0f);
    myLight1->setDirection(osg::Vec3(-1.0f,0.0f,0.0f));

    osg:: LightSource* lightS1 = new osg:: LightSource;   
    lightS1->setLight(myLight1);
    lightS1->setLocalStateSetModes(osg::StateAttribute::ON);
    lightS1->setStateSetModes(*rootStateSet,osg::StateAttribute::ON);
    lightGroup->addChild(lightS1);
    return lightGroup;
}
void main()
{
    osgViewer::Viewer viewer;
    osg::Node* loadedModel=osgDB::readNodeFile("F:/Model/box.flt");
        osg::ref_ptr<osg::Group> root = new osg::Group;
        root->addChild(loadedModel);

// create statesets.
    osg::StateSet* rootStateSet=new osg::StateSet;

        rootStateSet->setMode( GL_LIGHTING, osg::StateAttribute::ON );
    rootStateSet->setMode( GL_LIGHT0, osg::StateAttribute::ON );
        rootStateSet->setMode(GL_CULL_FACE,osg::StateAttribute::ON);

    root->setStateSet(rootStateSet);   
    root->addChild(createLights(rootStateSet));

        viewer.setSceneData(root);
    viewer.realize();
    viewer.run();
}

该用户从未签到

发表于 2012-4-13 10:07:04 | 显示全部楼层
如果感觉没有正确计算法线,可以用SmoothingVisitor自动重算一下

该用户从未签到

 楼主| 发表于 2012-4-21 22:33:20 | 显示全部楼层
本帖最后由 bdaabaa3b2a8 于 2012-4-21 22:33 编辑
array 发表于 2012-4-13 10:07
如果感觉没有正确计算法线,可以用SmoothingVisitor自动重算一下


谢谢array老师。我在osglight的例子程序中看到,它用的是osgUtil::SmoothingVisitor::smooth(osg::Geometry& geoset)计算法线;我意思是如果我用creator建模建的圆锥体,用osg读进来后赋给一个节点,这个节点能转换成osg::Geometry吗?然后在用 osgUtil::SmoothingVisitor::smooth(*geom);求它的法线。这样想对吗???

该用户从未签到

发表于 2012-4-23 19:21:18 | 显示全部楼层
SmoothingVisitor可以直接设置给Node的,node->accept(smoother)

该用户从未签到

 楼主| 发表于 2012-4-27 22:03:46 | 显示全部楼层
谢谢array老师
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

联系我们

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