osg:switchjquery判断有无子节点是否有子节点

当前位置: →
→ osg场景图DAG-有向无环图
osg场景图DAG-有向无环图
& 作者及来源: 可可西 - 博客园 &
&收藏到→_→:
摘要: osg场景图(DAG-有向无环图)
"osg场景图DAG-有向无环图"::
osg场景图是一个有向无循环图,如下图所示:
osg场景图中,所有节点全部为osg::node或从其派生出来。
其中,叶子节点(osg::geode)是模型数据节点(存放数据的节点),中间节点(或称枝节节点)为组节点(osg::group)。
挂在组节点下的子节点会执行相同的操作(如:平移,旋转,放缩等),
如果组节点下再挂组节点,作用到叶子节点上的将是一个从下到上的综合结果。
注意:上图中box会在施加了两种不同变换后,被分别绘制出来(最终会绘制出两个box),但在box在内存中只有一份。
++++++++++++++++++++++++++++++++++++++++
osg::geode
osg::geode的实质是一组图元,下面有若干个osg::drawable(可绘制体)。
其中,osg::drawable是一个简单的或复杂的图元,可以是一个正方形,也可以是栅格化的字符串。
osg::geode典型示例:osg::billboard标志牌。
osg::group
根据不同的用途,有各种不同的组结点,它们都继承自osg::group。
如osg::lod,可以根据距离远近等因素选择不同的子结点渲染。
如osg::switch,可以在两个子结点中任选其一。
如osg::sequence,可以构建序列动画。
如osg::transform,改变其所有子结点相对于场景中其它结点的坐标,可以是旋转、平移或缩放等。
我们常用osg::matrixtransform和osg::positionattitudetransform。
osg::camera就是从osg::transform继承来。
*** node& &group&&geode***
*** drawable ***
搜索此文相关文章:此文来自: 马开东博客
网址: 站长QQ
osg场景图DAG-有向无环图_博客园相关文章
博客园_总排行榜
博客园_最新
博客园_月排行榜
博客园_周排行榜
博客园_日排行榜osg不同节点间的碰撞检查_中华文本库
1.2 OSG 场景组织 场景图里面包含了各种各样类型的节点来执行 不同的用户提出...碰撞检测 m_rootNode-&accept(upIntersectVisitor);//第 三条线段与场景做碰撞...
OSG几何变换实验三_计算机软件及应用_IT/计算机_专业...实现人机交互功能,键入不同的键可实现不同部分的...创建 MatrixTransform 根节点及身体各部分的 Matrix...
关键词 : 碰撞检测技术 ; 颗粒碰撞 ;OSG 图形引擎...移动控制及 相关参3 利用碰撞世界设置 节点 数加载...用来解决刚体对象之间的碰撞检3], 但是由于虚 拟...
它扩展了核心OSG场景图形节点类的功 那么窗13就拥有...还比如碰撞检测 (属性物体)和坦克(物体)装配在一起...缩小了图像底层特征和高层语义之间的差异,提高图像...
基于OSG的虚拟数控机床刀具碰撞检测技术研究_机械/仪表_工程科技_专业资料 暂无评价|0人阅读|0次下载 基于OSG的虚拟数控机床刀具碰撞检测技术研究_机械/仪表_工程...
OSG学习 笔记_信息与通信_工程科技_专业资料。Switch(转换)节点用于标记来控制其...(100.0f,100.0f,0.0f)); 帧动画:在时间轴的每一帧上逐帧绘制不同的内容...
//节点查找类 class findNodeVisitor:public osg::NodeVisitor { public: //...();//轮循设备读取当前状态 if(FAIL,ED(hr)) { //输入流中断,不能通过...
5 1.2.5 检查 OSG 的安装 ……….. 6 1.3...场景 图形节点,几何体类,渲染状态(纹理贴图及光照)...可以在线框 模式,点模式和填充多边形渲染模式之间切换...
创建模型需要注意模型的面片 数与实际逼真性之间的平衡...OSG 渲染引擎 结构或树结构, 来组成一组节点集, .../ / 位置 变换函数 碰撞检测 ... float m_fAngle...
关键词: 虚拟引擎; 物理引擎; 场景; 碰撞检测 中...场景图形树状结构的顶部是一个根节点, OSG 中用 ...不同的世界对象 之间不存在任何关联, 不能互相影响...我们通过osg::ref_ptr&osg::Group& root = new osg::Group();申请场景根节点
通过osg::ref_ptr&osg::Node& node = new osg::Node();可以申请多个节点,从而达到在场景中添加多个场景
osg::ref_ptr&osg::Group& root = new osg::Group();
osg::ref_ptr&osg::Node& node = osgDB::readNodeFile(&cow.osg&);
root-&addChild(osgDB::readNodeFile(&glider.osg&));
root-&addChild(node.get());
因某种需要,现需要删除某些节点。可以通过removeChild删除个别节点,也可以通过removeChildren删除多个节点,里面的参数有些需要索引值
如:root-&removeChild(node1);
如果要删除一个节点,那么该节点下的所有节点都会被删除,如果一个节点被加入到一个组中两次,那么这两次就分别存在,删除一次还有另一次。
在内存映像中,如果一个模型被读取一次,而用了多次,那么所占用的空间是不会改变的。
osg::ref_ptr&osg::Group&类型结点root,root下加三个孩子osg::ref_ptr&osg::Node&类型结点node1、node2、node3,
程序会按加的顺序记录索引,此时root会记录node1、node2、node3分别为孩子0、1、2,node1、node2、node3也都会记录root为它们的父亲0,
若:node1下还有一些孩子节点,即其为一树,&使用root-&removeChild(node1);&///移除root下的node1结点,node1的树关系不会变
,只是解除root与node1的父子关系
这时root会自动将noee2变为root孩子0,node3变为root孩子1。对于node1变为无父亲节点。只要没有对node1指针清零,这个节点的数据还是存在的,还可以再次利用。
若:定义类型的变化结点。
操作&为孩子,为孩子,为孩子。
操作 tansform-&addChild(node1);&///node1的父亲为,假设还有其他父节点,那么结果就是是其最后一个父亲了。
经常使用这两段代码对场景根下的某个结点进行位置变换,所以,使用孩子取代函数并不是对被取代结点和取代结点进行简单的替换,而是每进行一次这样的操作会把取代结点作为根节点的最后一个孩子索引,被取代节点也是把取代结点作为最后一个父亲。
隐藏模式,只是将模型隐藏,模型仍在渲染中,损耗并未减少。
可以通过:node-&setNodeMask(0X0) 设置隐藏
可以通过:node-&setNodeMask(1) 设置显示
在关闭节点时,这些节点占用的内存会被释放掉
osgViewer::V
osg::ref_ptr&osg::Group& root = new osg::Group();
osg::ref_ptr&osg::Node& node = osgDB::readNodeFile(&robot.osg&);
osg::ref_ptr&osg::Switch& sw = new osg::Switch();
root-&addChild(osgDB::readNodeFile(&glider.osg&));
& & & &//开关节点
sw-&addChild(node,false); & //false参数显示关,可通过设置为ture显示为开
root-&addChild(sw);
viewer.setSceneData(root);
viewer.realize();
return viewer.run();
本文已收录于以下专栏:
相关文章推荐
    osg提供了一个遍历节点的类。osg::NodeVisitor,它提供一系列apply的
重载函数,用于访问某类型结点。
 virtual void apply (LightSource...
setlocale(LC_ALL,&chs&);
osg::Group* pRoot = new osg::G
osg::Node*pNode = osgDB::readNodeFile...
1、添加节点之前要先声明一个组也就是根节点,就像是节点树一样必须要有一个根,然后在这个根下添加子节点,而子节点下还可以添加子节点,可通过osg::Group来创建一个根节点,如下代码所示:
osg智能指针的陷阱示例
我们通过osg::ref_ptr root = new osg::Group();申请场景根节点
通过osg::ref_ptr node = new osg::Nod...
一、osg::Node类
类描述:osg::Node为结点类,下有派生类无数,是OSG中最重要的类之一,也是最常用的类之一。
1、Node ()
      Node (const Node...
添加已有模型 
在osg中同时加入多个模型(A,B,C……),可通过Group-&addChild(A)添加。然后再把group添加到viewer中就可以了
添加自定义模型
添加用户自定义模型,我...
首先一开始设置场景中的某个节点为隐藏状态
mtCenter-&setNodeMask(0);一开始尝试在eventHandler里面使用节点名字来遍历这个节点,发现根本找不到,因为设置为隐藏节点,大...
下面的文章虽然写的较早,但是对比例子代码还是可用的,我已经对比了osg3.5.1版本的例子。觉得不错。感谢原作者。
osgcallback程序注解及CallBack回调的介绍(转)
http://...
他的最新文章
讲师:刘文志
讲师:陈伟
您举报文章:
举报原因:
原文地址:
原因补充:
(最多只允许输入30个字)2、首先在添加模型时,要有一个标示,以便点击鼠标时,通过该标示知道点击的是否是这个模型,在此是加入白边的模型牛,白边对象为Scribe。
3、创建一个事件对象,并将该对象添加到场景中,那么在场景中就可以通过获取鼠标来做相应的动作。
4、在事件对象中有一个虚函数handle,那么在此函数中将处理所有的事件,并在此事件中获取鼠标点击的坐标。
5、获取之后调用Pick函数,并将坐标传入到该函数内。
6、在该函数内通过computeIntersections函数,然后根据坐标来拾取该鼠标下的模型集合。
7、定义一个迭代器。
8、遍历该迭代器。
9、判断模型的路径以及名称是否为空。
10、如果不为空,则遍历该路径下的所有节点。
11、将节点动态转换为Scribe指针,如果在节点中存在Scribe对象,则返回的不为NULL,否则为NULL,有节点在第2步加入的,因此有一个模型时不为NULL
12、如果找到了Scribe对象,则判断该对象是否已经隐藏,如果未隐藏,则将该节点隐藏起来。
2、首先在添加模型时,要有一个标示,以便点击鼠标时,通过该标示知道点击的是否是这个模型,在此是加入白边的模型牛,白边对象为Scribe。
3、创建一个事件对象,并将该对象添加到场景中,那么在场景中就可以通过获取鼠标来做相应的动作。
4、在事件对象中有一个虚函数handle,那么在此函数中将处理所有的事件,并在此事件中获取鼠标点击的坐标。
5、获取之后调用Pick函数,并将坐标传入到该函数内。
6、在该函数内通过computeIntersections函数,然后根据坐标来拾取该鼠标下的模型集合。
7、定义一个迭代器。
8、遍历该迭代器。
9、判断模型的路径以及名称是否为空。
10、如果不为空,则遍历该路径下的所有节点。
11、将节点动态转换为Scribe指针,如果在节点中存在Scribe对象,则返回的不为NULL,否则为NULL,有节点在第2步加入的,因此有一个模型时不为NULL
12、如果找到了Scribe对象,则判断该对象是否已经隐藏,如果未隐藏,则将该节点隐藏起来。
#include &osgViewer/Viewer&
#include &osgViewer/ViewerEventHandlers&
#include &osg/Node&
#include &osg/Geode&
#include &osg/Group&
#include &osgDB/ReadFile&
#include &osgDB/WriteFile&
#include &osgFX/Scribe&
#include &osgGA/GUIEventHandler&
#include &osgUtil/Optimizer&
#include &iostream&
//对象选取事件处理器
class PickHandler : public osgGA::GUIEventHandler
PickHandler():
_mx(0.0f),
~PickHandler()
//事件处理函数
bool handle(const osgGA::GUIEventAdapter& ea,osgGA::GUIActionAdapter& aa)
osg::ref_ptr&osgViewer::View& view = dynamic_cast&osgViewer::View*&(&aa);
if (!view)
switch(ea.getEventType())
//鼠标按下
case(osgGA::GUIEventAdapter::PUSH):
//更新鼠标位置
_mx = ea.getX();
_my = ea.getY();
pick(view.get(), ea.getX(), ea.getY());
case(osgGA::GUIEventAdapter::RELEASE):
if (_mx==ea.getX() && _my==ea.getY())
//执行对象选取
//pick(view.get(), ea.getX(), ea.getY());
//对象选取事件处理器
void pick(osg::ref_ptr&osgViewer::View& view, float x, float y)
osg::ref_ptr&osg::Node& node = new osg::Node();
osg::ref_ptr&osg::Group& parent = new osg::Group();
//创建一个线段交集检测函数
osgUtil::LineSegmentIntersector::Interse
if (view-&computeIntersections(x, y, intersections))
osgUtil::LineSegmentIntersector::Intersection intersection = *intersections.begin();
osg::NodePath& nodePath = intersection.nodeP//直接获取相交模型点的节点
//得到选择的物体
node = (nodePath.size()&=1)?nodePath[nodePath.size()-1]:0;
parent = (nodePath.size()&=2)?dynamic_cast&osg::Group*&(nodePath[nodePath.size()-2]):0;
//用一种高亮显示来显示物体已经被选中
if (parent.get() && node.get())
osg::ref_ptr&osgFX::Scribe& parentAsScribe = dynamic_cast&osgFX::Scribe*&(parent.get());
if (!parentAsScribe)
//如果对象选择到,高亮显示
osg::ref_ptr&osgFX::Scribe& scribe = new osgFX::Scribe();
scribe-&addChild(node.get());
parent-&replaceChild(node.get(),scribe.get());
//如果没有没有选择到,则移除高亮显示的对象
osg::Node::ParentList parentList = parentAsScribe-&getParents();
for(osg::Node::ParentList::iterator itr=parentList.begin();
itr!=parentList.end();
(*itr)-&replaceChild(parentAsScribe.get(),node.get());
//得到鼠标的位置
int main()
//创建Viewer对象,场景浏览器
osg::ref_ptr&osgViewer::Viewer& viewer = new osgViewer::Viewer();
viewer-&addEventHandler(new PickHandler());
//创建场景组节点
osg::ref_ptr&osg::Group& root = new osg::Group();
//创建一个节点,读取牛的模型
osg::ref_ptr&osg::Node& node = osgDB::readNodeFile(&cow.osg&);
//添加到场景
root-&addChild(node.get());
//优化场景数据
osgUtil::O
optimizer.optimize(root.get()) ;
viewer-&setSceneData(root.get());
viewer-&realize();
viewer-&run();
return 0 ;
本文已收录于以下专栏:
相关文章推荐
OSG中的智能指针
智能指针对于C++程序员来说并不是一个陌生的东西,它在c++的内存管理中有着很广泛的应用(在最开始的时候,由于对智能指针不了解,还天真的以为智能指针就是osg的独创,想起来还正是...
OSG中添加多个物体, osg::Group的使用。
OSG中提到的visitor通常都是使用NodeVisitor,在毕设论文中做场景重构的时候需要获取三角面片的纹理坐标时,用到了getTexCoorArray()函数,对他们的读取要用到ArrayVi...
#include #include #include #include #include #include #include #include #include int main(){ osg::re...
目标是,视图中有很多节点,当两个节点间有碰撞,那么能够检测出来。(其中不存在运动模型)
问题简化为检查两个节点是否碰撞。
解决思路是首先判断两个节点的包围盒(对象比较细长,不适合用包围球)是否有相交,...
对OsgBullet编译后的示例程序Example collision进行修改,将原来的立方体包围盒修改为三角网格,使得可以对模型做更精确的碰撞检测。
view plaincopy to clipboardprint?
#include   
#include   
#include   
#include   
#include ...
在三维场景中有时需要对两点求其是否可见,即两点之间有没有障碍物的遮挡。在OSG中则可使用碰撞检测完成此功能。
核心的碰撞检测代码为:
// 创建需要进行检测的两点之间的线段
在例子“osgpick”中,有一段类似下面的代码  
if (view-&computeIntersections(x, y, intersections))
源地址:http://m.oschina.net/blog/347822
摘要Abstract:本文主要对工厂和海工设计软件AVEVA的交互方式进行详细介绍,对OpenSceneGraph中的人...
他的最新文章
讲师:刘文志
讲师:陈伟
您举报文章:
举报原因:
原文地址:
原因补充:
(最多只允许输入30个字)节点访问:    OSG中节点的访问使用的是一种访问器模式。一个典型的访问器涉及抽象访问者角色(Visitor), 具体访问者(Concrete Visitor), 节点角色(Node)。
OSG中访问者角色为NodeVisitor类,其基本结构如下:  NodeVisitor(TraversalMode tm)&&& //构造函数,TraversalMode为节点树的遍历方式                   //TRAVERSE_NONE, 仅当前节点                   //TRAVERSE_PARENTS, 向当前节点的父节点遍历                   //TRAVERSE_ALL_CHILDREN, 向子节点遍历  void traverse(Node& node)  //向下一个需要访问的节点推进  void apply(Node& node)   //虚函数,访问各种节点类型,并执行访问器中的自定义操作  void apply(Group& node)  void apply(Geode& node)  &&&&
NodeVisitor 只是访问器角色的抽象接口,要使用访问器访问节点并执行自定义操作时,需要继承并重写apply(&&)函数实现自定义功能。osg::Node类中的访问接口为 void accept(NodeVisitor& nv)。对节点的访问从节点接受一个访问器开始,将一个具体的访问器对象传递给节点,节点反过来执行访问器的apply(...)函数,并将自己传入访问器。可如下简单表示:  void Node::accept(NodeVisitor& nv)  {    nv.apply(*ths) ;  }
遍历节点树: osg::Node类中有两个辅助函数:  void ascend(NodeVisitor& nv)&&&& //虚函数,向上一级节点推进访问器  void traverse(NodeVisitor& nv)&& //虚函数,向下一级节点推进访问器& NodeVisitor的traverse()函数实现如下:  inline void traverse(Node& node)&&&&&&{&&&&&&&&&&& if (_traversalMode == TRAVERSE_PARENTS)         node.ascend(*this);&&&&&&&&&&& else if (_traversalMode != TRAVERSE_NONE)         node.traverse(*this);&&&&&&}  示例如下:
1 #include &osg/Node& 2 #include &osgDB/ReadFile& 3 #include &iostream& 4
5 &using namespace 6
7 class InfoVisitor: public osg::NodeVisitor 8 { 9 public:10
InfoVisitor()11
:osg::NodeVisitor(TRAVERSE_ALL_CHILDREN), _indent(0)12
virtual void apply(osg::Node& node)15
for(int i = 0; i & _ i++)
cout && "[" && _indent && "]"&& node.libraryName()18
&& "::" && node.className() &&19 20
_indent++;21
traverse(node);22
_indent--;23 24
for(int i = 0; i & _ i++)
cout && "[" && _indent && "] "&& node.libraryName()26
&& "::" && node.className() &&27
virtual void apply(osg::Geode& node)30
for(int i = 0; i & _ i++)
cout && "[" && _indent && "] "&& node.libraryName()33
&& "::" && node.className() &&34 35
_indent++;36 37
for(unsigned int n = 0; n & node.getNumDrawables(); n++)38
osg::Drawable* draw = node.getDrawable(n);40
if(!draw)41
continue;42
for(int i = 0; i &
cout && "[" && _indent && "]" && draw-&libraryName() && "::" 44
&& draw-&className() &&45
traverse(node);48
_indent--;49 50
for(int i = 0; i & _ i++)
cout && "[" && _indent && "]"&& node.libraryName()52
&& "::" && node.className() &&53
}54 private:55
int _56 };57 58 int main(int argc, char** argv)59 {60
osg::ArgumentParser
parser(&argc, argv);61
osg::Node* root = osgDB::readNodeFiles(parser);62 63
if(!root)64
root = osgDB::readNodeFile("avatar.osg");66
InfoVisitor infoV69
if(root)70
root-&accept(infoVisitor);72
system("pause");75
return 0;76 }
阅读(...) 评论()

我要回帖

更多关于 jquery判断有无子节点 的文章

 

随机推荐