查看: 2921|回复: 11

【新手求助】『已结』仿3DMax旋转拖拽器扇面被遮挡问题。

[复制链接]

该用户从未签到

发表于 2012-9-22 12:33:51 | 显示全部楼层 |阅读模式
本帖最后由 starmessage 于 2012-9-26 21:55 编辑

仿3DMax旋转球做的,扇形什么的实现后,发现问题,透明旋转球从某个角度看时,遮挡住了扇形与文字,该怎么弄,我设置了这个,也不行,请高人指点下。
如图:
11.jpg
扇形被球体挡住了,并且文字XYZ也被挡住了
12.jpg
换个角度,扇形显示
13.jpg
换个角度,文字XYZ才显示

明显是球的问题,但是我透明度设置了,底下的这个也设置了,可还是被挡住了,怎么解决呢?

代码对于旋转球和文字扇形都设置了这个属性,透明度,光照属性就不概述了。               
getOrCreateStateSet()->setRenderingHint(osg::StateSet::TRANSPARENT_BIN);

现在贴上代码,希望各位帮帮忙。到底怎么回事

粘贴上简单的代码,看看有没有人能够帮帮我。
osg::Geode* createSphere()
{
        osg::Geode* sphereGeode = new osg::Geode;
        osg::ShapeDrawable* sphereShapeDrawable=new osg::ShapeDrawable(new osg::Sphere(osg::Vec3(0.0f,0.0f,0.0f),0.9f));
        sphereShapeDrawable->setColor(osg::Vec4(1.0f,1.0f,0.0f,0.1f));
        sphereGeode->addDrawable(sphereShapeDrawable);
        sphereGeode->getOrCreateStateSet()->setMode(GL_BLEND,osg::StateAttribute::ON);
        sphereGeode->getOrCreateStateSet()->setRenderingHint(osg::StateSet::TRANSPARENT_BIN);
        return sphereGeode;
}

osg::Geode* createLoop()
{
        osg::Geode* loopGeode=new osg::Geode;
        int angleNum=(int)(235/1.0);
        const float angleDelta = 1*2.0f*osg:I/(float)360;
        const float r =0.98f;
        osg::Vec3 _vFirPoint(1.0f,1.0f,0.0f);
        osg::Vec3 _vCenter(0.0f,0.0f,0.0f);
        if (abs(_vFirPoint.x())>0.99) _vFirPoint[0]=_vFirPoint.x()/abs(_vFirPoint.x())*0.90;
        if (abs(_vFirPoint.y())>0.99) _vFirPoint[1]=_vFirPoint.y()/abs(_vFirPoint.y())*0.90;
        float angle = 2*asin(abs(sqrt((_vFirPoint.x()-r)*(_vFirPoint.x()-r)+_vFirPoint.y()*_vFirPoint.y()))/r/2.0f);
        if(_vFirPoint.y()<0) angle=2*osg::PI-angle;
        osg::Vec3Array* vertexArray = new osg::Vec3Array(angleNum+2);
        osg::Vec3Array* normalArray = new osg::Vec3Array(angleNum+2);
        osg::Vec4Array* colorArray=new osg::Vec4Array(1);
        (*colorArray)[0].set(1.0f,1.0f,0.0f,0.2f);
        (*vertexArray)[0].set(_vCenter);
        (*vertexArray)[0].set(0.0f,0.0f,0.0f);
        for(unsigned int i = 1; i < angleNum+2; ++i,angle+=angleDelta)
        {
                float c = cosf(angle);
                float s = sinf(angle);
                (*vertexArray).set(c*r,s*r,0.0f);
                (*normalArray).set(c,s,1.0f);
        }
        osg::Geometry* geometry = new osg::Geometry();
        geometry->setVertexArray(vertexArray);
        geometry->setNormalArray(normalArray);
        geometry->setColorArray(colorArray);
        geometry->setNormalBinding(osg::Geometry::BIND_PER_VERTEX);
        geometry->setColorBinding(osg::Geometry::BIND_OVERALL);
        geometry->addPrimitiveSet(new osg:rawArrays(osg::PrimitiveSet::TRIANGLE_FAN,0,vertexArray->size()));
        loopGeode->addDrawable(geometry);
        loopGeode->getOrCreateStateSet()->setMode(GL_BLEND,osg::StateAttribute::ON);
        loopGeode->getOrCreateStateSet()->setRenderingHint(osg::StateSet::TRANSPARENT_BIN);
        return loopGeode;
}
int _tmain(int argc, _TCHAR* argv[])
{
        osg::ref_ptr<osg::Group> root = new osg::Group;
        osgViewer::Viewer viewer;
        root->addChild(createLoop());
        root->addChild(createSphere());
        viewer.setSceneData(root.get());
        return viewer.run();
}

调整加入的结点的顺序一样使不能解决。但是加入box等对象,可以透过去了,是不是loop法线等的问题,希望可以解决。

12.jpg
11.jpg

该用户从未签到

发表于 2012-9-22 21:50:52 | 显示全部楼层
本帖最后由 sky11811 于 2012-9-22 21:51 编辑

绘制文字时关闭深度测试,且文字最后绘制。

该用户从未签到

 楼主| 发表于 2012-9-22 22:12:11 | 显示全部楼层
sky11811 发表于 2012-9-22 21:50
绘制文字时关闭深度测试,且文字最后绘制。

您意思是说,像HUD那样?干脆直接前端显示就可以了?但是整个拖拽器容器是关闭了深度测试和最后绘制的,难道?子结点要再设一遍?

该用户从未签到

 楼主| 发表于 2012-9-22 23:58:27 | 显示全部楼层
sky11811 发表于 2012-9-22 21:50
绘制文字时关闭深度测试,且文字最后绘制。

首先整个拖拽球已经设置了深度测试和渲染顺序。

我各个子结点都试了试
getOrCreateStateSet()->setMode(GL_DEPTH_RANGE,osg::StateAttribute::OFF | osg::StateAttribute:ROTECTED);

整个拖拽球用的是AutoTransform,子节点的文字部分也是AutoTransform,没有摄像机,没用HUD。
camera->setClearMask(GL_DEPTH_BUFFER_BIT);
camera->setRenderOrder(osg::Camera::POST_RENDER);
这两句不知道怎么用。。。
请指点下。

问题仍然存在。

该用户从未签到

发表于 2012-9-23 11:57:44 | 显示全部楼层
应该是透明排序的问题吧

该用户从未签到

 楼主| 发表于 2012-9-23 20:43:39 | 显示全部楼层
StackSnow 发表于 2012-9-23 11:57
应该是透明排序的问题吧

那怎么调。

该用户从未签到

发表于 2012-9-24 17:17:42 | 显示全部楼层
osgRecipes里面早就有完善的仿max操控器的例子了,呵呵呵

该用户从未签到

 楼主| 发表于 2012-9-25 12:04:20 | 显示全部楼层
array 发表于 2012-9-24 17:17
osgRecipes里面早就有完善的仿max操控器的例子了,呵呵呵

array哥哥,帮我看看好不好。

该用户从未签到

 楼主| 发表于 2012-9-25 12:20:00 | 显示全部楼层
本帖最后由 starmessage 于 2012-9-25 12:20 编辑
starmessage 发表于 2012-9-25 12:04
array哥哥,帮我看看好不好。


要做成与3DMax一样的操作器,平移的已经OK了,现在旋转球为了实现扇形区域这块遇见的问题,你说的那个用了libgizmo,去官网上看了下,和3DMax还是有出入的,要是那样的话,我就不用这么痛苦了。。。。libgizmo能和3DMax操作器一模一样?没下过,望指点,关于扇形和球体透明的问题,希望array哥哥看一下。好不好。谢谢你了。

该用户从未签到

 楼主| 发表于 2012-9-26 21:54:27 | 显示全部楼层
来结贴的,关闭深度测试就OK了,确实是。呵呵,GL_TEST。GL这方面看的少,确实需要加强啊。

该用户从未签到

发表于 2013-3-11 21:16:50 | 显示全部楼层
starmessage 发表于 2012-9-26 21:54
来结贴的,关闭深度测试就OK了,确实是。呵呵,GL_TEST。GL这方面看的少,确实需要加强啊。

请问楼主是怎么控制拖拽器与场景一起旋转的啊?

该用户从未签到

发表于 2013-3-12 07:52:18 | 显示全部楼层
lanbomegp 发表于 2013-3-11 21:16
请问楼主是怎么控制拖拽器与场景一起旋转的啊?

不要是根节点就好了,Dragger和要操作的是同级的,addTransformation
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

联系我们

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