在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;
}

结果图:

最新文章

  1. od 查看特殊格式的文件内容
  2. Power of Cryptography(用double的泰勒公式可行分析)
  3. 安卓虚拟机启动失败intel haxm未安装
  4. Notepad++ Emmet安装方法教程
  5. getHitRect获取点击控件的位置
  6. linux sed 命令
  7. 【python,logging】python中的logging模块
  8. 关于ios中的文本操作-简介
  9. 住javaWeb分页实现(模拟百度首页)
  10. your local changes would be overwritten by merge. commit stash or revert them to proceed. view them
  11. mysql innodb init function error
  12. 阿里云免费试用之体验——阿里云serverECS试用心得
  13. C#基础知识-XML介绍及基本操作(十)
  14. Docker(二):Docker镜像使用
  15. Java基本数据类型的长度范围
  16. RecyclerView下拉刷新上拉加载(一)
  17. 记一次阿里云ECS服务器图片资源迁移至 阿里云 oss
  18. HtmlAgilityPack 的东西
  19. 一种表达式语言的解析引擎JEXL简单使用
  20. Java并发集合(一)-CopyOnWriteArrayList分析与使用

热门文章

  1. springboot整合Mybatis(一)——入门
  2. 24-[jQuery]-案例
  3. 2-4 list练习题
  4. AGC 007 D - Shik and Game
  5. code first 创建数据库,add-migration update-database
  6. mysql my.init
  7. restful_framework之APIView
  8. STM平台增加性能测试/稳定性测试部分【一】
  9. Post请求和Get请求;@RequestBody和@RequestParam
  10. WebStorm微信小程序单位rpx出现空格问题