查看: 1711|回复: 14

公告板问题

[复制链接]

该用户从未签到

发表于 2013-3-25 19:23:21 | 显示全部楼层 |阅读模式
本帖最后由 1162810317 于 2013-3-25 19:35 编辑

场景中用公告板做的树,但不知道该怎么让树成批的生成,请大神指点,,,为什么不能用下面的for循环呢???
for(count ;count < 500 ;count +=100)
        {
        osg::ref_ptr<osg:ositionAttitudeTransform> pat = new osg::PositionAttitudeTransform;       
        pat->setScale(osg::Vec3(5.0f, 5.0f, 5.0f)); //比例
        pat->addChild(createBillboardTree(image.get()));
        pat->setPosition( osg::Vec3(count,0,0.f) );
        pat3->addChild(pat.get());  
        }
或者是
osg::ref_ptr<osg::PositionAttitudeTransform> pat = new osg::PositionAttitudeTransform;       
for(count ;count < 500 ;count +=100)
        {
        pat->setScale(osg::Vec3(5.0f, 5.0f, 5.0f)); //比例
        pat->addChild(createBillboardTree(image.get()));
        pat->setPosition( osg::Vec3(count,0,0.f) );
        pat3->addChild(pat.get());  

        }
还有就是因为树的位置不是随机生成的,不知道该怎么一一生成这些树了,不可能每次都用for循环什么的,请大神指教!!
谢谢!!!!

该用户从未签到

发表于 2013-3-26 07:59:27 | 显示全部楼层
有多少位置需要种树 就需要循环多少次呗

该用户从未签到

 楼主| 发表于 2013-3-26 09:26:37 | 显示全部楼层
liuzhiyu123 发表于 2013-3-26 07:59
有多少位置需要种树 就需要循环多少次呗

谢谢,我的神啊!您不会告诉我这是真的吧?
大神还想请教您一个问题,就是公告板那个四边形明明是透明的,为什么还会把后面的公告板给遮住啊,然后还会过滤掉一些东西??但后面的房子什么又可以看到不知道是什么原因、我看了LZ.OSG里面的不会这样啊!谢谢!

该用户从未签到

发表于 2013-3-26 09:34:39 | 显示全部楼层
这个createBillboardTree(image.get()) 是可以共享的,遮挡的那个 不知道您设置的对不对,应该是从远到近的渲染方式  这样透明的才可以正确显示

该用户从未签到

 楼主| 发表于 2013-3-26 15:44:09 | 显示全部楼层
本帖最后由 1162810317 于 2013-3-26 16:28 编辑
liuzhiyu123 发表于 2013-3-26 09:34
这个createBillboardTree(image.get()) 是可以共享的,遮挡的那个 不知道您设置的对不对,应该是从远到近的 ...


谢谢,我试试!
呃,,大神我不清楚您说的从远到近是渲染方式具体是设置哪个?我知道有先后渲染,,但没看到您说的远近,,,您能不能说详细点?谢谢!
osg::ref_ptr<osg::Node>createBillboardTree(osg::ref_ptr<osg::Image> image,osg::Vec3 position)
{  //创建四边形
        osg::ref_ptr<osg::Geometry> geometry = new osg::Geometry;
        //设置顶点  
        osg::ref_ptr<osg::Vec3Array> v = new osg::Vec3Array;
        v->push_back(osg::Vec3(-50.0f, 0.0f, -50.0f));  //0.5
        v->push_back(osg::Vec3(50.0f, 0.0f, -50.0f));  
        v->push_back(osg::Vec3(50.0f, 0.0f, 50.0f));
        v->push_back(osg::Vec3(-50.0f, 0.0f, 50.0f));  
        geometry->setVertexArray(v.get());   
        //设置法线
        osg::ref_ptr<osg::Vec3Array> normal = new osg::Vec3Array;
        normal->push_back(osg::Vec3(1.0f, 0.0f, 0.0f)
                ^ osg::Vec3(0.0f, 0.0f, 1.0f));
        geometry->setNormalArray(normal.get());
        geometry->setNormalBinding(osg::Geometry::BIND_OVERALL);   
        //设置纹理坐标
        osg::ref_ptr<osg::Vec2Array> vt = new osg::Vec2Array;  
        vt->push_back(osg::Vec2(0.0f, 0.0f));
        vt->push_back(osg::Vec2(1.0f, 0.0f));  
        vt->push_back(osg::Vec2(1.0f, 1.0f));
        vt->push_back(osg::Vec2(0.0f, 1.0f));
        geometry->setTexCoordArray(0, vt.get());  
        //绘制四边形
        geometry->addPrimitiveSet(new osg:rawArrays(osg:rimitiveSet:UADS, 0, 4));
        if (image.get())
        {

                osg::ref_ptr<osg::StateSet> stateset = new osg::StateSet;
                osg::ref_ptr<osg::Texture2D> texture = new osg::Texture2D;
                //关联image
                texture->setImage(image.get());
                //关联Texture2D纹理对象,第三个参数默认为ON  
                stateset->setTextureAttributeAndModes(0, texture, osg::StateAttribute::ON);
                //启用混合  
                stateset->setMode(GL_BLEND, osg::StateAttribute::ON);
                //关闭光照  
                stateset->setMode(GL_LIGHTING, osg::StateAttribute::OFF);
                geometry->setStateSet(stateset.get());  
        }  
        //创建Billboard对象  
        osg::ref_ptr<osg::Billboard> billboard1 = new osg::Billboard;
        //设置旋转模式
        billboard1->setMode(osg::Billboard::AXIAL_ROT  );
        billboard1->setAxis (osg::Vec3(0,0,1));
        //添加Drawable,并设置其位置,默认位置为osg::Vec3(5.0f, 0.0f, 0.0f)
        billboard1->addDrawable(geometry.get(), position);  
        return billboard1.get();
}

该用户从未签到

发表于 2013-3-27 07:42:26 | 显示全部楼层
1162810317 发表于 2013-3-26 15:44
谢谢,我试试!
呃,,大神我不清楚您说的从远到近是渲染方式具体是设置哪个?我知道有先后渲染,,但 ...

先从远到近 进行排序 然后先渲染最远的 然后依次拉近

该用户从未签到

 楼主| 发表于 2013-3-27 09:55:18 | 显示全部楼层
本帖最后由 1162810317 于 2013-3-27 10:23 编辑
liuzhiyu123 发表于 2013-3-27 07:42
先从远到近 进行排序 然后先渲染最远的 然后依次拉近


呃,,,,大神我还是不清楚,这远近是相对于场景中点吗?如果是这样的话,当我的视点移动到最远处a,往场景中点c看的话又会出现这样的情况。如果相对于视点的话,视点是不断移动的,那就要不断的渲染??每个单独设置渲染???不理解,请大神指导!谢谢!

该用户从未签到

发表于 2013-3-28 09:07:28 | 显示全部楼层
对每个billboard设置setRenderBinHint(TRANSPARENT_BIN),或者setRenderBinDetails设置渲染序号!你的贴图是不是有透明通道??将混合关了试试!如果将混合关了没有这个问题了,就应该没有问题了!按我的理解,混合关了应该可以解决你的问题!如果有透明通道,加上alphaTest! 无非就这几个问题!

该用户从未签到

 楼主| 发表于 2013-3-28 09:46:56 | 显示全部楼层
本帖最后由 1162810317 于 2013-3-28 11:16 编辑

截图2.jpg 截图.jpg
buptronin 发表于 2013-3-28 09:07
对每个billboard设置setRenderBinHint(TRANSPARENT_BIN),或者setRenderBinDetails设置渲染序号!你的贴图是 ...

一个是往前看,一个是往后看,先渲染的会挡住后渲染的!
谢谢大 神指点,我回去试试。谢谢!

该用户从未签到

 楼主| 发表于 2013-3-28 11:19:49 | 显示全部楼层
本帖最后由 1162810317 于 2013-3-28 11:22 编辑
buptronin 发表于 2013-3-28 09:07
对每个billboard设置setRenderBinHint(TRANSPARENT_BIN),或者setRenderBinDetails设置渲染序号!你的贴图是 ...


我回去试了,图片有通道,但将混合关掉后就不透明了,然后设置渲染序号的我还是不理解,不就是因为渲染有先后才导致先的挡住后的吗?
setRenderBinHint(TRANSPARENT_BIN);不是osg::StateSet的成员啊??
还请多多指教!谢谢!

该用户从未签到

发表于 2013-3-28 13:46:42 | 显示全部楼层
是stateset成员啊!设置了这个以后对透明物体会进行深度排序的!你说的先的挡住后的是什么意思?前面的挡住后面的吧!这个是深度!呃。。。。。我不明白您要达到什么目的了!哈哈,描述一下需求吧!

该用户从未签到

发表于 2013-3-28 14:28:17 | 显示全部楼层
我觉得首先应该明白一个原理,就是如果要显示透明的东西,那么应该对要显示的东西进行排序,由远到近,然后按照这个顺序进行渲染,不然 很可能就因为Depth Test 过不去 就产生所谓的遮挡了

该用户从未签到

 楼主| 发表于 2013-3-28 15:46:01 | 显示全部楼层
本帖最后由 1162810317 于 2013-3-28 17:20 编辑
liuzhiyu123 发表于 2013-3-28 14:28
我觉得首先应该明白一个原理,就是如果要显示透明的东西,那么应该对要显示的东西进行排序,由远到近,然后 ...


哦,这样,那个上面有两张图片(第一张)就是我说的那个遮挡,但反过来看就可以了。您看下是不是您说的那种情况???



谢谢大神指点!
问题解决了,谢谢大神指点!!!!

该用户从未签到

 楼主| 发表于 2013-3-28 15:47:39 | 显示全部楼层
本帖最后由 1162810317 于 2013-3-28 16:26 编辑
buptronin 发表于 2013-3-28 13:46
是stateset成员啊!设置了这个以后对透明物体会进行深度排序的!你说的先的挡住后的是什么意思?前面的挡住 ...


哦,这样,那个上面有两张图片(第一张)就是我说的那个遮挡,但反过来看就可以了。您看下是不是您说的那种情况???
谢谢大神的指点!
2,        1        IntelliSense: class "osg::StateSet" has no member "setRenderBinHint"        提示说没有这个成员!


我还是上代码吧if (image.get())
        {

                osg::ref_ptr<osg::StateSet> stateset = new osg::StateSet;
                osg::ref_ptr<osg::Texture2D> texture = new osg::Texture2D;
                //关联image
                texture->setImage(image.get());
                //关联Texture2D纹理对象,第三个参数默认为ON  
                stateset->setTextureAttributeAndModes(0, texture, osg::StateAttribute::ON);
                //启用混合  
                stateset->setMode(GL_BLEND, osg::StateAttribute::ON);
                //关闭光照  
                stateset->setMode(GL_LIGHTING, osg::StateAttribute::OFF);
        //        stateset->setRenderBinDetails(1, "RenderBin");
        //        stateset->setRenderBinHint(TRANSPARENT_BIN);
                geometry->setStateSet(stateset.get());  
        }  
        //创建Billboard对象  
        osg::ref_ptr<osg::Billboard> billboard1 = new osg::Billboard;
        //设置旋转模式为绕视点
        billboard1->setMode(osg::Billboard::AXIAL_ROT  );
        billboard1->setAxis (osg::Vec3(0,0,1));
       
        //添加Drawable,并设置其位置,默认位置为osg::Vec3(5.0f, 0.0f, 0.0f)
        billboard1->addDrawable(geometry.get(), position);  
        return billboard1.get();
谢谢!

该用户从未签到

 楼主| 发表于 2013-3-28 17:22:48 | 显示全部楼层
问题解决了,谢谢大神的指点,设置了一个stateset->setRenderingHint (2);

谢谢北邮的大神!
谢谢liuzhiyu123
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

联系我们

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