查看: 2219|回复: 14

OSG格式写出与颜色绑定问题

[复制链接]

该用户从未签到

发表于 2009-11-4 10:42:27 | 显示全部楼层 |阅读模式
我在创建模型的时候,如果使用如下的编程方式
osg::Vec4Array* vc = new osg::Vec4Array();
vc->push_back(osg::Vec4(reslut*1.5,0.0f,0.2f,1.0f));
geom->setColorArray(vc);
geom->setColorBinding(osg::Geometry::BIND_OVERALL);
的话,写成osg文件的时候,用readnodefile是可以打开的,osgviewer也是可以打开的!

但是如果写成
osg::Vec4Array* vc = new osg::Vec4Array();
vc->push_back(osg::Vec4(1.0f,0.0f,0.2f,1.0f));
vc->push_back(osg::Vec4(0.0f,1.0f,0.0f,1.0f));
vc->push_back(osg::Vec4(0.0f,0.0f,1.0f,1.0f));
vc->push_back(osg::Vec4(1.0f,1.0f,0.0f,1.0f));
geom->setColorArray(vc);
geom->setColorBinding(osg::Geometry::BIND_PER_VERTE);
的话,写成osg文件的时候,用readnodefile就打不开,但是osgviewer却还是可以打开,不知道原因在哪里?

该用户从未签到

发表于 2009-11-4 11:06:59 | 显示全部楼层
怎么打不开,是报错还是不显示?

该用户从未签到

 楼主| 发表于 2009-11-4 11:42:07 | 显示全部楼层
2# tianxiao888
报错的.....
错误在openthreads里面

该用户从未签到

发表于 2009-11-4 12:03:22 | 显示全部楼层
geom->setColorBinding(osg::Geometry::BIND_PER_VERTE);

可能是这句问题,,它与顶点关联吧~~~

该用户从未签到

发表于 2009-11-4 12:06:43 | 显示全部楼层
颜色值与顶点关联,那么是否是严格的一一对应呢?不然可能会有错误

该用户从未签到

 楼主| 发表于 2009-11-4 13:35:15 | 显示全部楼层
4# FlySky
应该是这句的问题,但是问题是这句怎么会出错呢?
应该怎么去改正呢?我还没有找到解决办法!

该用户从未签到

 楼主| 发表于 2009-11-4 13:36:32 | 显示全部楼层
5# array
是严格一一对应的,每创建一个四边形,然后把四边形的顶点颜色确定!

该用户从未签到

发表于 2009-11-4 15:07:36 | 显示全部楼层
那么不会有错,很显然您漏掉了一些应当说明的信息

该用户从未签到

 楼主| 发表于 2009-11-4 17:15:44 | 显示全部楼层
本帖最后由 boystu 于 2009-11-4 17:19 编辑

8# array
osg::Geometry *geom = new osg::Geometry();

osg::ref_ptr<osg::Vec3Array> v = new osg::Vec3Array();
v->push_back(osg::Vec3(first[0] , first[1] , first[2]));
v->push_back(osg::Vec3(second[0], second[1] , second[2]));
v->push_back(osg::Vec3(third[0] , third[1] , third[2]));
v->push_back(osg::Vec3(fourth[0], fourth[1] , fourth[2]));

geom->setVertexArray(v);

geom->addPrimitiveSet(new osg:rawArrays(osg:rimitiveSet:UADS,0,4));

osgUtil::SmoothingVisitor::smooth(*geom);

osg::ref_ptr<osg::Vec4Array> vc = new osg::Vec4Array();
vc->push_back(osg::Vec4(r[0],g[0],b[0],1.0f));
vc->push_back(osg::Vec4(r[1],g[1],b[1],1.0f));
vc->push_back(osg::Vec4(r[2],g[2],b[2],1.0f));
vc->push_back(osg::Vec4(r[3],g[3],b[3],1.0f));

geom->setColorArray(vc);
geom->setColorBinding(osg::Geometry::BIND_PER_VERTEX);

return geom;

上面的代码是creatquad函数的代码!看看有什么问题

该用户从未签到

发表于 2009-11-4 22:17:50 | 显示全部楼层
看起来没什么问题,您可以去检查别的部分

该用户从未签到

发表于 2009-11-5 00:48:56 | 显示全部楼层
geom->setVertexArray(v);
修改为
geom->setVertexArray(v.get());

geom->setColorArray(vc);
修改为
geom->setColorArray(vc.get());

其他的好像没什么问题~~~~~

该用户从未签到

发表于 2009-11-5 08:15:47 | 显示全部楼层
那个倒是不用修改,呵呵;OSG的2.6之后增加了ref_ptr:: operator()操作符,可以直接编译通过了;不过维持使用get()的一个好习惯也不错。

该用户从未签到

 楼主| 发表于 2009-11-5 09:18:47 | 显示全部楼层
留在这里吧,不知道到底哪里出错了,呵呵!等等再说吧...

该用户从未签到

发表于 2009-11-5 10:35:12 | 显示全部楼层
:funk:

该用户从未签到

 楼主| 发表于 2009-11-5 14:25:23 | 显示全部楼层
14# FlySky
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

联系我们

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