在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)的更多相关文章

  1. OSG学习:位置变换节点示例

    osg::PositionAttitudeTransform节点. #include <osgViewer\Viewer> #include <osg\Node> #inclu ...

  2. osg学习示例之遇到问题四骨骼动画编译osgCal

    osg学习示例之遇到问题四骨骼动画编译osgCal 转自:http://blog.csdn.net/wuwangrun/article/details/8239451 今天学到书<OpenSce ...

  3. OSG学习:裁剪变换(2)

    接着上一篇博客说. 还有一种裁剪的方法:osg::Scissor类. 这个类封装了OpenGL中的glScissor()函数. 该类主要用于设置一个视口裁剪平面举行.设置裁剪平面举行的函数如下: vo ...

  4. SharpGL学习笔记(六) 裁剪变换

    在OpenGL中,除了视景体定义的6个裁剪平面(上下左右前后)外, 用户还可以定义一个或者多个附加的裁剪平面,以去掉场景中无关的目标. 附加平面裁剪函数原型如下: ClipPlane(OpenGL.G ...

  5. 【OSG学习笔记之一:】OSG+VS2010+win7 64位环境搭建

    虽然出生的时候,没有说过“Hello World!”,但是自从走上了编程之路,每一次输出“Hello World!”的时候,都觉得好比中了彩票大奖似的: 仔细算算,从2012年暑假到现在,经历了3年半 ...

  6. OSG学习:自动对齐节点示例

    /********************************************************** *Write by FlySky *zzuxp@163.com http://w ...

  7. osg学习笔记3 简单几何模型

    osg::Geode (geometry node) osg::Geode类表示场景中的渲染几何叶节点,它包含了渲染用的几何信息,没有子节点. 要绘制的几何数据保存在osg::Geode管理的一组os ...

  8. osg学习笔记2, 命令行参数解析器ArgumentParser

    ArgumentParser主要负责命令行参数的读取 #include <osgDB/ReadFile> #include <osgViewer/Viewer> int mai ...

  9. OSG学习:计算纹理坐标

    在很多时候,直接指定纹理坐标是非常不方便的,如曲面纹理坐标,只有少数的曲面(如圆锥.圆柱等)可以在不产生扭曲的情况下映射到平面上,其他的曲面在映射到表面时都会产生一定程度的扭曲.一般而言,曲面表面的曲 ...

随机推荐

  1. 托管代码编写mssql存储过程

    参考:http://wenku.it168.com/d_000642903.shtml 打开vs,创建数据库项目,添加新项,选择sql clr c#, 选择存储过程. 样例: [Microsoft.S ...

  2. Android内核编译

    说明: 我这里用的是Android 4.2.2自带的交叉编译工具.如果是使用host系统安装的,我觉得应该也是可以的.但是没有测试过.因为Android源代码已经自带了,所以大多数情况下,不需要再安装 ...

  3. WPF : ListBox的几种Template属性

    原文:WPF : ListBox的几种Template属性 属性名 属性的类名 功能 示例 Template ControlTemplate 定义控件自身的外观.其子元素的布局可以自定义,也可以由It ...

  4. 使用最新版的Adobe Photoshop CC 2017

    1. 装之前建议把之前老的Photoshop删干静.打开官网 https://www.adobe.com/cn/products/photoshop.html  点免费使用 ,会下载一个安装器Crea ...

  5. eclipse - 新建jsp页面默认模板设置

    有时候我们自己如果没有现成的JSP模板时,系统一般会自动生成如下页面: 这个页面显然并不是我们所需要的,所以我们需要修改默认模板 进入 修改 <%@ page language="ja ...

  6. BZOJ3601. 一个人的数论(狄利克雷卷积+高斯消元)及关于「前 $n$ 个正整数的 $k$ 次幂之和是关于 $n$ 的 $k+1$ 次多项式」的证明

    题目链接 https://www.lydsy.com/JudgeOnline/problem.php?id=3601 题解 首先还是基本的推式子: \[\begin{aligned}f_d(n) &a ...

  7. python并发编程之多进程理论知识

    一 什么是进程 进程:正在进行的一个过程或者说一个任务.而负责执行任务则是cpu. 举例(单核+多道,实现多个进程的并发执行): egon在一个时间段内有很多任务要做:python备课的任务,写书的任 ...

  8. layer.msg(msg, time, parme)设置图标问题

    layer.msg只提到3个参数,实际上有第4个参数,第4个参数就是msg关闭后执行的回调.   layer.msg('提示', 2, 1, function(){})   第一个参数:提示 第二个参 ...

  9. 大同世界的Java 和.NET 开发

    1.作为一个科班出生的根正苗红的软件开发人员,我认为现在的一群年轻的程序员总是在讨论JAVA  好还是.NET 好的同时,我作为一个做4年开发的.NET 程序员中间穿插了1年JAVA 开发的来说更加的 ...

  10. 关于big-endian和little-endian

    详解大端模式和小端模式 一.大端模式和小端模式的起源 关于大端小端名词的由来,有一个有趣的故事,来自于Jonathan Swift的<格利佛游记>:Lilliput和Blefuscu这两个 ...