查看: 1823|回复: 4

替换模型

[复制链接]

该用户从未签到

发表于 2010-12-6 14:39:53 | 显示全部楼层 |阅读模式
代码是这样的:
  node = osgDB::readNodeFile(addName);
  //man->setAddNode(node.get());
  
  
  //创建节点查找访问器
  FindNodeVisitor find("03-GEODE", "shui1-GEODE", "shui2-GEODE");
  //启动访问器,开始执行遍历
  node->accept(find);
  //viewer->getCamera()->setCullMask(~0x00000001);
  osg::ref_ptr<osg::Group> model = new osg::Group;
  model->addChild(node.get());
  osg::ref_ptr<osg::Node> hl = find.getNode();
  std::string str = hl->getName();
  //设置纹理坐标
  float txt_width = 512;
  float txt_height = 512;
  
  applyTexture(hl,txt_width,txt_height);
  //水面
  osg::ref_ptr<osg::Group> quad = new osg::Group;
  //osg::ref_ptr<osg:ositionAttitudeTransform> pos = new osg::PositionAttitudeTransform;
  //pos->addChild(hl.get());
  //pos->setPosition(osg::Vec3d(-0.49655151, 24.388184, -56.007622));
  quad->addChild(hl.get());
  
  root->addChild(createWaterScene(quad.get(), model.get()));

先是通过节点访问器找到node中水的模型;再对这个获取到的水面模型添加效果。
这样的话最后加点root总节点中就有两个水面的模型。
所以想先去掉node中水的模型,请问下这个要怎么实现?
我用了下setNodeMask()和removeChild()都不对。

该用户从未签到

 楼主| 发表于 2010-12-6 15:15:52 | 显示全部楼层
其中我这个model中已经有水的模型了,所以我再添加了个添加了效果的水面就出现了两个水面。
实际上就是想把model中的水模型去掉,用setNodeMask(),setCullMask()就把水面全去掉了,
用removeChild()根本去不掉,大哥们帮忙想想?

该用户从未签到

发表于 2010-12-6 16:17:03 | 显示全部楼层
我用了下setNodeMask()和removeChild()都不对。
您根本没有说明自己是如何去使用的,也没有说明自己遇到了怎样的结果。您认为大家应该如何帮助您?

该用户从未签到

 楼主| 发表于 2010-12-6 16:50:07 | 显示全部楼层
本帖最后由 MoonLight 于 2010-12-6 16:56 编辑

恩,我要做的就是对场景中的水添加波纹和反射;
先是利用NodeVisitor获取水的节点:代码如下

                      node = osgDB::readNodeFile(addName);
                                
               
                //创建节点查找访问器
                FindNodeVisitor find("03-GEODE", "shui1-GEODE", "shui2-GEODE");
                //启动访问器,开始执行遍历
                node->accept(find);


FindNodeVisitor.h:
#ifndef FIND_NODE_VISITOR_H
#define FIND_NODE_VISITOR_H

#include <osg/NodeVisitor>
#include <osg/Node>
#include <osg/TextureCubeMap>
#include <osg/Uniform>

#include <osgSim/DOFTransform>
#include <iostream>
#include <vector>
#include <string>

//节点查找访问器,继承自osg::NodeVisitor
class FindNodeVisitor : public osg::NodeVisitor
{
public:

        //构造函数,参数为需要查找的节点名
        FindNodeVisitor(const std::string &searchName, const std::string &searchName1, const std::string &searchName2) ;

        //重载apply方法
        virtual void apply(osg::Node &searchNode);

        osg::ref_ptr<osg::Node> getNode()
        {
                return m_node;
        }
private:

        //节点名
        std::string searchForName;
        std::string searchForName1;
        std::string searchForName2;

        osg::ref_ptr<osg::Node> m_node ;
        osg::ref_ptr<osg::Node> node;

};


#endif

FindNodeVisitor.cpp:
/**********************************************************
*Write by FlySky
*zzuxp@163.com  http://www.OsgChina.org   
**********************************************************/

#include "FindNodeVisitor.h"
#include <osg/StateSet>
#include <osg/Shader>
#include <osg/Program>
#include <osg/Uniform>
#include <osg/Texture2D>
#include <osg/TextureCubeMap>

#include <osgDB/ReadFile>

//构造函数,初始化并设置遍历所有的子节点
FindNodeVisitor::FindNodeVisitor(const std::string &searchName, const std::string &searchName1, const std::string &searchName2) :
        osg::NodeVisitor(TRAVERSE_ALL_CHILDREN),
                searchForName(searchName),
                searchForName1(searchName1),
                searchForName2(searchName2)
{
        //
}

//重载apply方法                                                                  
void FindNodeVisitor::apply(osg::Node &searchNode)
{
        std::string strName = searchNode.getName();

        //判断节点名称是否与查找的节点名称一样
        if (strName == searchForName || strName ==searchForName1 || strName == searchForName2)
        {
                m_node = &searchNode;
                node = &searchNode;
                node->setNodeMask(0x00000001);
        }

        //继续遍历
        traverse(searchNode);
}

再向这个获取到的水节点中添加效果:
viewer->getCamera()->setCullMask(~0x00000001);
                osg::ref_ptr<osg::Group> model = new osg::Group;
                model->addChild(node.get());

                osg::ref_ptr<osg::Node> hl = find.getNode();                                   osg::ref_ptr<osg::Group> quad = new osg::Group;
                                quad->addChild(hl.get());
               

                root->addChild(createWaterScene(quad.get(), model.get()));
其中quad是水的模型,model是水反射的模型;
在createWaterScene(quad.get(), model.get())函数中
osg::ref_ptr<osg::Group> root = new osg::Group;
root->addChild(water.get());
root->addChild(rttCamera.get());
root->addChild(model.get());
return root.get();


就是上面红字部分,所以当我用setNodeMask()时就没有水的模型,去掉setNodeMask()时就出现2个水的模型

该用户从未签到

 楼主| 发表于 2010-12-6 18:17:58 | 显示全部楼层
问题解决了,原来是我思维错了,只要把水效果中的state付给场景中的水就行了
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

联系我们

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