|
我采用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
|
-
渲染图
|