查看: 4574|回复: 6

如何绘制圆锥型玻璃

[复制链接]

该用户从未签到

发表于 2008-9-10 09:48:46 | 显示全部楼层 |阅读模式
我的代码是这样的:
  1.         //画圆锥
  2.         shape = new osg::ShapeDrawable(new osg::Cone(osg::Vec3(0.0f, 0.0f, 1.0f), radius*2, 0.5), hints.get());
  3.         shape->setColor(osg::Vec4(1.0f, 1.0f, 1.0f, 0.1f)); //把圆锥设置为白色透明
  4.         geode3->addDrawable(shape.get());
复制代码
怎么一点玻璃的感觉都没有呢,而且也不透明……
还有,要把圆锥变成圆顶要怎么做?

该用户从未签到

发表于 2008-9-10 12:17:52 | 显示全部楼层
得到并设置属性,,使用混合(GL_ALPHA )~~~~

该用户从未签到

发表于 2008-9-10 13:58:50 | 显示全部楼层
osg::Cone以及其它几个基本几何体主要是用于实验和临时演示,个人认为没有太大的产品价值,当然也不能实现您所说的圆顶。这些最好是自己绘制模型然后读入

该用户从未签到

 楼主| 发表于 2008-9-10 15:14:06 | 显示全部楼层
原帖由 FlySky 于 2008-9-10 12:17 发表
得到并设置属性,,使用混合(GL_ALPHA )~~~~

还是不透明啊,代码如下:
  1.         osg::ref_ptr <osg::Geode> geode3 = new osg::Geode ;
  2.         //画圆锥
  3.         shape = new osg::ShapeDrawable(new osg::Cone(osg::Vec3(0.0f, 0.0f, 2.5f), radius*2, 1.0), hints.get());
  4.         shape->setColor(osg::Vec4(1.0f, 1.0f, 1.0f, 0.1f)); //设置颜色
  5.         geode3->addDrawable(shape.get());

  6.         osg::StateSet* state = geode3->getOrCreateStateSet();
  7.         osg::ref_ptr<osg::Material> mat = new osg::Material;
  8.         //漫反射光(决定物体颜色)
  9.         mat->setDiffuse( osg::Material::FRONT,
  10.                 osg::Vec4( 1.f, 1.f, 1.f, 0.f ) );
  11.         //镜面反射光
  12.         mat->setSpecular( osg::Material::FRONT,
  13.                 osg::Vec4( 1.f, 1.f, 1.f, 0.f ) );
  14.         //环境反射光
  15.         mat->setShininess( osg::Material::FRONT, 128.f );
  16.         //设置透明度
  17.         mat->setTransparency(osg::Material::FRONT,0.0f);
  18.         mat->setTransparency(osg::Material::BACK,0.0f);
  19.         state->setAttribute( mat.get() );
  20.         state->setMode(GL_ALPHA,osg::StateAttribute::ON);
复制代码
问题出在哪呢?

该用户从未签到

发表于 2008-9-10 15:58:16 | 显示全部楼层
没有设置渲染属性osg::AlphaFunc啊。
不过不能保证加上以后就可以,正像我说的那样,Shape类不是很适合实际应用~~

该用户从未签到

 楼主| 发表于 2008-9-10 16:51:08 | 显示全部楼层
state->setMode(GL_ALPHA,osg::StateAttribute::ON);
state->setMode(GL_ALPHA,osg::AlphaFunc::ON);
是这样设的吗?
运行时命令行里不停的出现这个:
Warning: detected OpenGL error 'invalid enumerant' after RenderBin::draw(,)

该用户从未签到

发表于 2008-9-10 17:10:12 | 显示全部楼层
原帖由 Sailent 于 2008-9-10 16:51 发表
state->setMode(GL_ALPHA,osg::StateAttribute::ON);
state->setMode(GL_ALPHA,osg::AlphaFunc::ON);
是这样设的吗?
运行时命令行里不停的出现这个:
Warning: detected OpenGL error 'invalid enumerant' afte ...


完全不是……要新增加一个渲染属性StateAttribute的,就向您添加osg::Material材质那样。比如
  1. stateset->setMode( GL_ALPHA, osg::StateAttribute::ON );
  2. stateset->setAttribute( new osg::AlphaFunc(osg::AlphaFunc::GREATER, yourValue) );
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

联系我们

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