查看: 1347|回复: 2

采用NodeVisitor遍历方式,为模型各顶点赋颜色值

[复制链接]

该用户从未签到

发表于 2014-6-18 23:03:33 | 显示全部楼层 |阅读模式
我采用osg::Node * node=osgDB::readNodeFile("osg_tri.obj");函数读入了一个
.obj文件,文件中不保存颜色信息,但是我知道每个顶点的颜色,现在想让模型按照
我提供的颜色进行渲染,为此采用遍历的方式进行,遍历代码如下所示,下面的color
只设置了6个值,因为我读入的模型文件只有6个顶点,每个顶点对应一个颜色值。
class VertexVisitor :public osg::NodeVisitor
{
public:
        osg::Vec4Array * color;
        VertexVisitor()sg::NodeVisitor(osg::NodeVisitor::TRAVERSE_ALL_CHILDREN)
        {
                color =new osg::Vec4Array;
                color ->push_back(Vec4(1,0,0,1));
                color ->push_back(Vec4(0,1,0,1));
                color ->push_back(Vec4(0,0,1,1));
                color ->push_back(Vec4(1,1,0,1));
                color ->push_back(Vec4(0,1,1,1));
                color ->push_back(Vec4(1,1,1,1));
        }
        void apply(osg::Geode &geode)
        {
                for(unsigned int i=0;i<geode.getNumDrawables();i++)
                {
                        osg::Geometry * geometry = dynamic_cast<osg::Geometry *>(geode.getDrawable(i));
                        geometry->setColorArray(color);
                        geometry->setColorBinding(osg::Geometry::BIND_PER_VERTEX);
                }
        }
};
但是结果不如人意,如图所示
每个三角面元有3个顶点,存在几个三角形共顶点的情况,从渲染的结果来看,
它把共顶点的三角形顶点视为多个顶点,而不是一个顶点,最终导致输入的颜色
过少,一部分面未渲染出来。图中顶点1和顶点4其实应该共一个颜色,但实际渲染时
它却占用了两种颜色,导致剩余顶点无颜色可用。
请问,我该怎么解决这个问题了,并不一定要用NodeVisitor的方式来为不同的顶点
赋颜色值,大家看看有什么解决思路没有,谢谢。

附上模型数据
v  14.5357 -9.6904 54.9175
v  -11.8439 -36.0700 0.0050
v  40.9152 -36.0700 0.0050
v  40.9152 16.6891 0.0050
v  -11.8439 16.6891 0.0050
v  14.5357 -9.6904 0.0050
# 6 vertices

vn 0.0000 -0.9014 0.4330
vn 0.9014 0.0000 0.4330
vn 0.0000 0.9014 0.4330
vn -0.9014 0.0000 0.4330
vn 0.0000 0.0000 -1.0000
# 5 vertex normals

vt 0.5000 1.0000 0.0000
vt 0.0000 0.0000 0.0000
vt 1.0000 0.0000 0.0000
vt 0.0000 1.0000 0.0000
vt 0.5000 0.5000 0.0000
vt 1.0000 1.0000 0.0000
# 6 texture coords

g Pyramid001
f 1/1/1 2/2/1 3/3/1
f 1/1/2 3/2/2 4/3/2
f 1/1/3 4/2/3 5/3/3
f 1/1/4 5/2/4 2/3/4
f 2/4/5 6/5/5 3/6/5
f 3/6/5 6/5/5 4/3/5
f 4/3/5 6/5/5 5/2/5
f 5/2/5 6/5/5 2/4/5
# 8 faces

渲染图

渲染图

该用户从未签到

发表于 2014-6-19 09:40:43 | 显示全部楼层
你好,你的vn法线坐标不是和顶点一一对应的? 我提一些建议吧:
1 :你说的对顶点颜色赋值,你可以扩展读取obj的插件,在读取模型顶点时赋值,这样就可以了。
2: 如果你不考虑光照的话,你可以把vn设置为颜色,然后在GLSL的Shader里读取vn,然后赋值给颜色。

该用户从未签到

 楼主| 发表于 2014-6-21 21:37:40 | 显示全部楼层
谢谢CWorld,我还是看看第一条解决方案吧,法线我是要用的
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

联系我们

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