osgclip例子
来源:互联网 发布:软件测试工具qtp 编辑:程序博客网 时间:2024/05/16 14:29
本来自演示了ClipNode。
主要的内容都在decorate_with_clip_node中。
Clip在OpenGL中是定义裁剪面,然后glEnable,设置使用裁剪,于是在OpenGL的固定管线中就根据指定的
裁剪面裁剪。
才以上分析我们可以指定,在OSG中Clip属于一种状态,因此,定义裁剪就是设置一个StateSet。OSG中会
根据设置了节点StateSet构建一棵状态树,这棵状态树会根据State改变当时OpenGL的状态,比如,进入A
节点,它设置了StateSet,此时,根据StateSet设置状态,离开的时候再设置回去。这就是State类中非
常有用的pushStateSet和popStateSet。
因此,ClipNode的实现就不能理解,ClipNode就是定义了裁剪面的组节点,加入到CLipNode中的子节点都
会根据指定的裁剪面裁掉。
在OSG中ClipPlane是一个裁剪面,继承StateAttribute,可以通过Plane指定空间中任意的一个裁剪面。
看看ClipNode中的createClipBox方法,根据BoundingBox定义了一个裁剪盒子,实际上是定义了六个裁剪
面。
_planes.clear();
if (!_stateset.valid()) _stateset = new osg::StateSet;
_planes.push_back(new ClipPlane(clipPlaneNumberBase ,1.0,0.0,0.0,-bb.xMin()));
_stateset->setAssociatedModes(_planes.back().get(), _value);
_planes.push_back(new
ClipPlane(clipPlaneNumberBase+1,-1.0,0.0,0.0,bb.xMax()));
_stateset->setAssociatedModes
(_planes.back().get(), _value);
_planes.push_back(new ClipPlane(clipPlaneNumberBase
+2,0.0,1.0,0.0,-bb.yMin()));
_stateset->setAssociatedModes(_planes.back().get(),
_value);
_planes.push_back(new ClipPlane(clipPlaneNumberBase+3,0.0,-1.0,0.0,bb.yMax()));
_stateset->setAssociatedModes(_planes.back().get(), _value);
_planes.push_back(new
ClipPlane(clipPlaneNumberBase+4,0.0,0.0,1.0,-bb.zMin()));
_stateset->setAssociatedModes
(_planes.back().get(), _value);
_planes.push_back(new ClipPlane(clipPlaneNumberBase
+5,0.0,0.0,-1.0,bb.zMax()));
_stateset->setAssociatedModes(_planes.back().get(), _value);
通过setAssociatedModes设置了裁剪状态。
我们接着看例子:
在decorate_with_clip_node中首先定义了一个用网格显示的模型,
osg::PolygonMode* polymode = new osg::PolygonMode;
polymode->setMode
(osg::PolygonMode::FRONT_AND_BACK,osg::PolygonMode::LINE);
stateset-
>setAttributeAndModes(polymode,osg::StateAttribute::OVERRIDE|osg::StateAttribute::ON);
PolygonMode也是继承自StateAttribute,可以修改StateSet的状态。
接下来
osg::MatrixTransform* transform= new osg::MatrixTransform;
osg::NodeCallback* nc = new
osg::AnimationPathCallback(subgraph->getBound().center(),osg::Vec3
(0.0f,0.0f,1.0f),osg::inDegrees(45.0f));
transform->setUpdateCallback(nc);
定义了一个变换节点,AnimationPathCallback有一个构造函数,指定中心,旋转轴和旋转角度,自动进
行旋转,这里可以看AnimationPath.cpp中的源码,通过AnimationPath实现的旋转。
接下来就是定义了一个ClipNode,指定一个BoundingSphere,
clipnode->setCullingActive(false);设置在裁切的过程中不裁切这个节点。
然后定义了一个Group节点,加入了传进来的模型(面显示),指定了这个组节点的StateSet,
clipped_subgraph->setStateSet(clipnode->getStateSet());为裁剪节点的状态。
这样就实现了,这个组节点被这个ClipNode裁切。实现了本例子的效果,一个线状模型,一个面状模型被
旋转的裁切节点裁切。
主要的内容都在decorate_with_clip_node中。
Clip在OpenGL中是定义裁剪面,然后glEnable,设置使用裁剪,于是在OpenGL的固定管线中就根据指定的
裁剪面裁剪。
才以上分析我们可以指定,在OSG中Clip属于一种状态,因此,定义裁剪就是设置一个StateSet。OSG中会
根据设置了节点StateSet构建一棵状态树,这棵状态树会根据State改变当时OpenGL的状态,比如,进入A
节点,它设置了StateSet,此时,根据StateSet设置状态,离开的时候再设置回去。这就是State类中非
常有用的pushStateSet和popStateSet。
因此,ClipNode的实现就不能理解,ClipNode就是定义了裁剪面的组节点,加入到CLipNode中的子节点都
会根据指定的裁剪面裁掉。
在OSG中ClipPlane是一个裁剪面,继承StateAttribute,可以通过Plane指定空间中任意的一个裁剪面。
看看ClipNode中的createClipBox方法,根据BoundingBox定义了一个裁剪盒子,实际上是定义了六个裁剪
面。
_planes.clear();
if (!_stateset.valid()) _stateset = new osg::StateSet;
_planes.push_back(new ClipPlane(clipPlaneNumberBase ,1.0,0.0,0.0,-bb.xMin()));
_stateset->setAssociatedModes(_planes.back().get(), _value);
_planes.push_back(new
ClipPlane(clipPlaneNumberBase+1,-1.0,0.0,0.0,bb.xMax()));
_stateset->setAssociatedModes
(_planes.back().get(), _value);
_planes.push_back(new ClipPlane(clipPlaneNumberBase
+2,0.0,1.0,0.0,-bb.yMin()));
_stateset->setAssociatedModes(_planes.back().get(),
_value);
_planes.push_back(new ClipPlane(clipPlaneNumberBase+3,0.0,-1.0,0.0,bb.yMax()));
_stateset->setAssociatedModes(_planes.back().get(), _value);
_planes.push_back(new
ClipPlane(clipPlaneNumberBase+4,0.0,0.0,1.0,-bb.zMin()));
_stateset->setAssociatedModes
(_planes.back().get(), _value);
_planes.push_back(new ClipPlane(clipPlaneNumberBase
+5,0.0,0.0,-1.0,bb.zMax()));
_stateset->setAssociatedModes(_planes.back().get(), _value);
通过setAssociatedModes设置了裁剪状态。
我们接着看例子:
在decorate_with_clip_node中首先定义了一个用网格显示的模型,
osg::PolygonMode* polymode = new osg::PolygonMode;
polymode->setMode
(osg::PolygonMode::FRONT_AND_BACK,osg::PolygonMode::LINE);
stateset-
>setAttributeAndModes(polymode,osg::StateAttribute::OVERRIDE|osg::StateAttribute::ON);
PolygonMode也是继承自StateAttribute,可以修改StateSet的状态。
接下来
osg::MatrixTransform* transform= new osg::MatrixTransform;
osg::NodeCallback* nc = new
osg::AnimationPathCallback(subgraph->getBound().center(),osg::Vec3
(0.0f,0.0f,1.0f),osg::inDegrees(45.0f));
transform->setUpdateCallback(nc);
定义了一个变换节点,AnimationPathCallback有一个构造函数,指定中心,旋转轴和旋转角度,自动进
行旋转,这里可以看AnimationPath.cpp中的源码,通过AnimationPath实现的旋转。
接下来就是定义了一个ClipNode,指定一个BoundingSphere,
clipnode->setCullingActive(false);设置在裁切的过程中不裁切这个节点。
然后定义了一个Group节点,加入了传进来的模型(面显示),指定了这个组节点的StateSet,
clipped_subgraph->setStateSet(clipnode->getStateSet());为裁剪节点的状态。
这样就实现了,这个组节点被这个ClipNode裁切。实现了本例子的效果,一个线状模型,一个面状模型被
旋转的裁切节点裁切。
- osgclip例子
- Examples osgclip注释
- 例子
- 例子
- 例子
- 例子
- & + 例子
- / 例子
- 例子
- 例子
- 例子
- 例子
- 例子
- 例子
- 例子
- 例子
- 例子
- 例子
- 全双工改半双工制
- 解决errorpage里面取不到Authentication的问题
- HDU 2037 今年暑假不AC
- Linux认证复习题100道含答案 --linux基本操作
- Distinct Subsequences
- osgclip例子
- 为了解决业余时间做项目自己给自己偷懒找接口的问题我开通的这个博客
- leetcode power (x,n)
- 宽度自适应
- HDU 1789 Doing Homework again
- 贵的未必是好的:T5220和X86服务器上Oracle性能之比较
- 川哥个人网页
- poj3077
- C++ 模板的特化与偏特化