osg模型重写
2014-02-25 17:06
736 查看
setlocale(LC_ALL,"chs");
osg::Group* pRoot = new osg::Group;
osg::Node*pNode = osgDB::readNodeFile("F:\\三维数据\\HY15\\现状\\现状建筑\\XZJZ01\\SubIve\\Level1\\sub1.osg");
pRoot->addChild(pNode);
osg::ref_ptr<osg::Geode> geode = dynamic_cast<osg::Geode*>(pNode);
int num = geode->getNumDrawables();
osg::ref_ptr<osg::Geometry> mGeometry =new osg::Geometry();
mGeometry->setDataVariance( osg::Object::DYNAMIC );
osg::StateSet* stateset = new osg::StateSet;
osg::Material *pMaterial = new osg::Material;
pMaterial->setAmbient(osg::Material::FRONT_AND_BACK, osg::Vec4(osg::Vec4(0.0, 0.0, 0.0, 1.0)));
pMaterial->setDiffuse(osg::Material::FRONT_AND_BACK, osg::Vec4(osg::Vec4(0.0, 0.0, 0.0, 1.0)));
pMaterial->setSpecular(osg::Material::FRONT_AND_BACK, osg::Vec4(osg::Vec4(0.0, 0.0, 0.0, 1.0)));
pMaterial->setEmission(osg::Material::FRONT_AND_BACK, osg::Vec4(osg::Vec4(1.0, 1.0, 1.0, 1.0)));
pMaterial->setShininess(osg::Material::FRONT_AND_BACK, 0.0f);
stateset->setAttribute(pMaterial);
mGeometry->setStateSet(stateset);
osg::ref_ptr<osg::Vec3Array > mVertexArray = new osg::Vec3Array();
osg::ref_ptr<osg::Vec3Array > mNormalArray = new osg::Vec3Array();
stateset->setMode( GL_LIGHTING, osg::StateAttribute::ON );
stateset->setMode( GL_CULL_FACE, osg::StateAttribute::ON );
int t =0;
int vectorNum = 0;
for (int i =0;i<num;i++)
{
osg::ref_ptr<osg::Geometry> pGeometry= dynamic_cast<osg::Geometry*>(geode->getDrawable(i));
osg::StateSet* ss = pGeometry->getStateSet();
osg::StateSet::TextureAttributeList texAbl = ss->getTextureAttributeList();
for(osg::StateSet::TextureAttributeList::size_type i=0; i<texAbl.size(); ++i)
{
osg::StateAttribute* sa = ss->getTextureAttribute(i, osg::StateAttribute::TEXTURE);
osg::Texture2D* tex2d = dynamic_cast<osg::Texture2D*>(sa);
if(tex2d==NULL)continue;
stateset->setTextureAttributeAndModes(t,tex2d,osg::StateAttribute::ON);
mGeometry->setTexCoordArray(t,pGeometry->getTexCoordArray(i));
t++;
}
for (int j =0;j<pGeometry->getNumPrimitiveSets();j++)
{
if (pGeometry->getPrimitiveSet(j)->getType() == osg::PrimitiveSet::DrawElementsUShortPrimitiveType )
{
osg::DrawElementsUShort*ss1 = dynamic_cast<osg::DrawElementsUShort*> (pGeometry->getPrimitiveSet(j));
if (ss1)
{
for (int p =0 ;p<ss1->getNumIndices();p++)
{
if (ss1)
{
int Primitive = ss1->getElement(p)+vectorNum;
//std::cout<<Primitive<<std::endl;
ss1->setElement(p,Primitive);
}
}
mGeometry->addPrimitiveSet(pGeometry->getPrimitiveSet(j));
}
}
else if (pGeometry->getPrimitiveSet(j)->getType() == osg::PrimitiveSet::DrawArraysPrimitiveType)
{
osg::DrawArrays*ss1 = dynamic_cast<osg::DrawArrays*> (pGeometry->getPrimitiveSet(j));
if (ss1)
{
int Primitive = ss1->getFirst()+vectorNum;//
ss1->setFirst(Primitive);
mGeometry->addPrimitiveSet(pGeometry->getPrimitiveSet(j));
}
}
}
mGeometry->setNormalBinding(pGeometry->getNormalBinding());
int v =0;
osg::Vec3Array * pVertexArray = (osg::Vec3Array*)(pGeometry->getVertexArray());
vectorNum +=pVertexArray->size();
for (v = 0;v<pVertexArray->size();v++)
{
mVertexArray->push_back(pVertexArray->at(v));
}
osg::Vec3Array * pNormalArray = (osg::Vec3Array*)(pGeometry->getNormalArray());
for (v = 0;v<pNormalArray->size();v++)
{
mNormalArray->push_back(pNormalArray->at(v));
}
}
mGeometry->setVertexArray(mVertexArray);
mGeometry->setNormalArray(mNormalArray);
geode->removeDrawables(0,num);//删掉原始结点
geode->addDrawable(mGeometry.get());
osgDB::writeNodeFile((*geode),"F:\\三维数据\\HY15\\现状\\现状建筑\\XZJZ01\\SubIve\\Level1\\sub1.osg");
===============================
思路:将多个geometry合并成一个geometry,用primitiveset控制形状
osg::Group* pRoot = new osg::Group;
osg::Node*pNode = osgDB::readNodeFile("F:\\三维数据\\HY15\\现状\\现状建筑\\XZJZ01\\SubIve\\Level1\\sub1.osg");
pRoot->addChild(pNode);
osg::ref_ptr<osg::Geode> geode = dynamic_cast<osg::Geode*>(pNode);
int num = geode->getNumDrawables();
osg::ref_ptr<osg::Geometry> mGeometry =new osg::Geometry();
mGeometry->setDataVariance( osg::Object::DYNAMIC );
osg::StateSet* stateset = new osg::StateSet;
osg::Material *pMaterial = new osg::Material;
pMaterial->setAmbient(osg::Material::FRONT_AND_BACK, osg::Vec4(osg::Vec4(0.0, 0.0, 0.0, 1.0)));
pMaterial->setDiffuse(osg::Material::FRONT_AND_BACK, osg::Vec4(osg::Vec4(0.0, 0.0, 0.0, 1.0)));
pMaterial->setSpecular(osg::Material::FRONT_AND_BACK, osg::Vec4(osg::Vec4(0.0, 0.0, 0.0, 1.0)));
pMaterial->setEmission(osg::Material::FRONT_AND_BACK, osg::Vec4(osg::Vec4(1.0, 1.0, 1.0, 1.0)));
pMaterial->setShininess(osg::Material::FRONT_AND_BACK, 0.0f);
stateset->setAttribute(pMaterial);
mGeometry->setStateSet(stateset);
osg::ref_ptr<osg::Vec3Array > mVertexArray = new osg::Vec3Array();
osg::ref_ptr<osg::Vec3Array > mNormalArray = new osg::Vec3Array();
stateset->setMode( GL_LIGHTING, osg::StateAttribute::ON );
stateset->setMode( GL_CULL_FACE, osg::StateAttribute::ON );
int t =0;
int vectorNum = 0;
for (int i =0;i<num;i++)
{
osg::ref_ptr<osg::Geometry> pGeometry= dynamic_cast<osg::Geometry*>(geode->getDrawable(i));
osg::StateSet* ss = pGeometry->getStateSet();
osg::StateSet::TextureAttributeList texAbl = ss->getTextureAttributeList();
for(osg::StateSet::TextureAttributeList::size_type i=0; i<texAbl.size(); ++i)
{
osg::StateAttribute* sa = ss->getTextureAttribute(i, osg::StateAttribute::TEXTURE);
osg::Texture2D* tex2d = dynamic_cast<osg::Texture2D*>(sa);
if(tex2d==NULL)continue;
stateset->setTextureAttributeAndModes(t,tex2d,osg::StateAttribute::ON);
mGeometry->setTexCoordArray(t,pGeometry->getTexCoordArray(i));
t++;
}
for (int j =0;j<pGeometry->getNumPrimitiveSets();j++)
{
if (pGeometry->getPrimitiveSet(j)->getType() == osg::PrimitiveSet::DrawElementsUShortPrimitiveType )
{
osg::DrawElementsUShort*ss1 = dynamic_cast<osg::DrawElementsUShort*> (pGeometry->getPrimitiveSet(j));
if (ss1)
{
for (int p =0 ;p<ss1->getNumIndices();p++)
{
if (ss1)
{
int Primitive = ss1->getElement(p)+vectorNum;
//std::cout<<Primitive<<std::endl;
ss1->setElement(p,Primitive);
}
}
mGeometry->addPrimitiveSet(pGeometry->getPrimitiveSet(j));
}
}
else if (pGeometry->getPrimitiveSet(j)->getType() == osg::PrimitiveSet::DrawArraysPrimitiveType)
{
osg::DrawArrays*ss1 = dynamic_cast<osg::DrawArrays*> (pGeometry->getPrimitiveSet(j));
if (ss1)
{
int Primitive = ss1->getFirst()+vectorNum;//
ss1->setFirst(Primitive);
mGeometry->addPrimitiveSet(pGeometry->getPrimitiveSet(j));
}
}
}
mGeometry->setNormalBinding(pGeometry->getNormalBinding());
int v =0;
osg::Vec3Array * pVertexArray = (osg::Vec3Array*)(pGeometry->getVertexArray());
vectorNum +=pVertexArray->size();
for (v = 0;v<pVertexArray->size();v++)
{
mVertexArray->push_back(pVertexArray->at(v));
}
osg::Vec3Array * pNormalArray = (osg::Vec3Array*)(pGeometry->getNormalArray());
for (v = 0;v<pNormalArray->size();v++)
{
mNormalArray->push_back(pNormalArray->at(v));
}
}
mGeometry->setVertexArray(mVertexArray);
mGeometry->setNormalArray(mNormalArray);
geode->removeDrawables(0,num);//删掉原始结点
geode->addDrawable(mGeometry.get());
osgDB::writeNodeFile((*geode),"F:\\三维数据\\HY15\\现状\\现状建筑\\XZJZ01\\SubIve\\Level1\\sub1.osg");
===============================
思路:将多个geometry合并成一个geometry,用primitiveset控制形状
相关文章推荐
- 操作码1:栈和局部变量操作
- VVVV的简介和安装
- 获取json数据,低版本android无法解析
- 数据库开发(22)高级事务处理
- 去年12月29日,红旗Linux员工在网上发出请愿书“风雨飘摇,中科红旗路在啊何方?”,又打出横幅”软件所还我核高基专项款,大股东无视职工死活“,到工信部大门口集体请愿、讨薪,闹得很不安宁。
- 那些年追过的明星
- Qt下Client与Server之间的双向TCP通信。
- 省中心IEPGM同步到地市的IEPGM有问题,中心为“已商用”状态,地市为“已上架”状态
- inux的安装和启动流程(http://www.2cto.com/os/201208/145165.html)
- Ex2010学习(十五),Exchange灾难重建
- sphinx/coreseek使用中的一个诡异的问题
- 通过目标文件自动生成动态库
- c语言 可变数组
- hibernate优化
- Android onCreate, onSaveInstanceState和onRestoreInstanceState与跳转的问题
- jQuery Mobile 表单基础
- ExtJS 刷新后,默认选中刷新前最后一次选中的节点
- extjs 3.3 合并单元格
- Linux系统手动安装rpm包依赖关系分析(以Kernel升级为例)
- 交叉编译libACE