OSG学习:裁剪变换(1)
在OSG中,默认了6个裁剪平面以去除没有必要显示的物体。也可以自己定义其他的裁剪平面来确定裁剪。
osg::ClipPlane类继承自osg::StateAttribute类,封装了OpenGL中的glClipPlane()函数。
在类的成员函数中,设置裁剪平面的有下面几个函数:
void setClipPlane(const Plane &plane)
void setClipPlane(double a, double b, double c, double d)
void setClipPlane(const Vec4d &plane)
参数都指向一个裁剪平面,裁剪平面可以用Ax+By+Cz+D=0方程表示。因此,A、B、C、D 4个数一次表示裁剪平面方程的4个参数。
上面的方法只是设置一个裁剪平面的参数,如果想要调用该裁剪平面,还需要在属性中开启该裁剪平面,如下面的代码:
root->getOrCreateStateSet()->setAttributeAndModes(cc,osg::StateAttribute::On);
如果在应用程序中药指定多个裁剪平面,此时需要注意指定平面的索引,否则前面先指定的裁剪平面会被覆盖。可以使用下面的函数:
void setClipPlaneNum(unsigned int num)
unsigned int getClipPlaneNum() const
得到一个裁剪平面的索引或者指定一个平面的索引。
示例代码
/**********************************************************
*Write by FlySky
*zzuxp@163.com http://www.OsgChina.org
**********************************************************/
#include <osgViewer/Viewer>
#include <osg/Node>
#include <osg/Geode>
#include <osg/Group>
#include <osg/ClipPlane>
#include <osg/StateAttribute>
#include <osgDB/ReadFile>
#include <osgDB/WriteFile>
#include <osgUtil/Optimizer>
int main()
{
osg::ref_ptr<osgViewer::Viewer> viewer = new osgViewer::Viewer() ;
//创建一个裁剪平面
osg::ref_ptr<osg::ClipPlane> cp1 = new osg::ClipPlane () ;
//设置裁剪平面
cp1->setClipPlane(0,1,1,1);
//指定平面索引
cp1->setClipPlaneNum(0);
//创建一个裁剪平面
osg::ref_ptr<osg::ClipPlane> cp2 = new osg::ClipPlane () ;
//设置裁剪平面
cp2->setClipPlane(1,0,0,1);
//指定平面索引
cp2->setClipPlaneNum(1);
osg::ref_ptr<osg::Group> root = new osg::Group();
//读取模型
osg::ref_ptr<osg::Node> node = osgDB::readNodeFile("cow.osg");
root ->addChild (node.get()) ;
//启用裁剪平面
root ->getOrCreateStateSet()->setAttributeAndModes (cp1.get(), osg::StateAttribute ::ON ) ;
root ->getOrCreateStateSet()->setAttributeAndModes (cp2.get(), osg::StateAttribute ::ON ) ;
//优化场景数据
osgUtil::Optimizer optimzier ;
optimzier.optimize(root.get());
viewer->setSceneData(root.get());
viewer->realize();
viewer->run();
return 0;
}
结果图:
OSG学习:裁剪变换(1)的更多相关文章
- OSG学习:位置变换节点示例
osg::PositionAttitudeTransform节点. #include <osgViewer\Viewer> #include <osg\Node> #inclu ...
- osg学习示例之遇到问题四骨骼动画编译osgCal
osg学习示例之遇到问题四骨骼动画编译osgCal 转自:http://blog.csdn.net/wuwangrun/article/details/8239451 今天学到书<OpenSce ...
- OSG学习:裁剪变换(2)
接着上一篇博客说. 还有一种裁剪的方法:osg::Scissor类. 这个类封装了OpenGL中的glScissor()函数. 该类主要用于设置一个视口裁剪平面举行.设置裁剪平面举行的函数如下: vo ...
- SharpGL学习笔记(六) 裁剪变换
在OpenGL中,除了视景体定义的6个裁剪平面(上下左右前后)外, 用户还可以定义一个或者多个附加的裁剪平面,以去掉场景中无关的目标. 附加平面裁剪函数原型如下: ClipPlane(OpenGL.G ...
- 【OSG学习笔记之一:】OSG+VS2010+win7 64位环境搭建
虽然出生的时候,没有说过“Hello World!”,但是自从走上了编程之路,每一次输出“Hello World!”的时候,都觉得好比中了彩票大奖似的: 仔细算算,从2012年暑假到现在,经历了3年半 ...
- OSG学习:自动对齐节点示例
/********************************************************** *Write by FlySky *zzuxp@163.com http://w ...
- osg学习笔记3 简单几何模型
osg::Geode (geometry node) osg::Geode类表示场景中的渲染几何叶节点,它包含了渲染用的几何信息,没有子节点. 要绘制的几何数据保存在osg::Geode管理的一组os ...
- osg学习笔记2, 命令行参数解析器ArgumentParser
ArgumentParser主要负责命令行参数的读取 #include <osgDB/ReadFile> #include <osgViewer/Viewer> int mai ...
- OSG学习:计算纹理坐标
在很多时候,直接指定纹理坐标是非常不方便的,如曲面纹理坐标,只有少数的曲面(如圆锥.圆柱等)可以在不产生扭曲的情况下映射到平面上,其他的曲面在映射到表面时都会产生一定程度的扭曲.一般而言,曲面表面的曲 ...
随机推荐
- POJ 1235 Machine Schedule 【二分图】
这道题考察对最小点覆盖的理解. 做法: 对于一个作业,它需要A的a模式和B的b模式,那么可以从a模式向b模式连一条边:可以感性的理解为每一条边就是一个作业,需要求得有多少个模式可以覆盖所有的边,也就是 ...
- 2017-2018-1 20155330 《信息安全系统设计基础》第10周课堂测试&课下作业
2017-2018-1 20155330 <信息安全系统设计基础>第10周课堂测试&课下作业 stat命令的实现-mysate 学习使用stat(1),并用C语言实现 提交学习st ...
- 使用cgroups来控制内存使用
磨砺技术珠矶,践行数据之道,追求卓越价值 回到上一级页面:PostgreSQL内部结构与源代码研究索引页 回到顶级页面:PostgreSQL索引页 [作者 高健@博客园 luckyjackga ...
- 洛咕 P2480 [SDOI2010]古代猪文
洛咕 P2480 [SDOI2010]古代猪文 题目是要求\(G^{\sum_{d|n}C^d_n}\). 用费马小定理\(G^{\sum_{d|n}C^d_n\text{mod 999911658} ...
- Laravel 跨框架队列交互
公司大部分项目是laravel框架,但有些是yii框架,这两个框架之间有消息需要通信,比如在yii框架发布消息,laravel框架中的队列去处理,用redis作为消息连接纽带 laravel 队列原理 ...
- Object C学习笔记9-字符串NSMutableString
NSMutableString类继承自NSString,所以在NSString中的方法在NSMutableString都可以使用. NSMutableString和NSString的区别在于NSMut ...
- 解决web翻转动画闪屏
首先确保backface-visibility: hidden.这样做可以解决大部分闪屏的情况. 然后需要特别注意的是谷歌的浏览器,不管是桌面端还是移动端,在翻转的过程中在该元素上绘制其他元素也会导致 ...
- 干货分享:五大最适合学习AI开发的编程语言
AI(人工智能)为应用开发者开创了一个全新的可能性.通过利用机器学习或深度学习,您可以生成更好的用户配置文件.个性化设置和推荐,或者整合更智能的搜索.语音界面或智能助手,或者以其他数种方式改进您的应用 ...
- xaf.domain object new 在属性上的用法
有如下业务对象定义: using System; using System.Linq; using System.Text; using DevExpress.Xpo; using DevExpres ...
- Appium+python的单元测试框架unittest(1)(转)
unittest为python语言自带的单元测试框架,python把unittest封装为一个标准模块封装在python开发包中.unittest中常用的类有:unittest.TestCase.un ...