在这里插入图片描述

OSG 裁剪平面(ClipPlane)

在 OpenSceneGraph(OSG)三维开发中,裁剪平面(ClipPlane) 是实现模型剖切、截面显示、空间可视区域筛选的核心工具。

它基于 OpenGL 裁剪平面机制,通过定义三维空间中的数学平面,对场景中的几何体进行动态裁剪,广泛应用于医疗可视化、工业仿真、建筑展示等领域。

本文将结合完整可运行代码,系统讲解 OSG ClipPlane 的继承关系、核心原理、使用方法与经典应用场景,帮助你快速掌握这一关键功能。

核心继承关系

OSG 采用面向对象的场景图架构,osg::ClipPlane 并非独立类,而是严格遵循 OSG 渲染状态体系的派生类,其完整继承链如下:

osg::Object
  └── osg::StateAttribute
       └── osg::ClipPlane

关键类作用解析

  1. osg::Object:OSG 所有对象的基类,提供引用计数、智能指针管理(ref_ptr)、对象命名等基础能力,保证内存安全。
  2. osg::StateAttribute渲染状态属性基类,是 OSG 控制 OpenGL 渲染状态的核心接口。裁剪平面、材质、纹理、光照等均派生自此类,统一通过 StateSet 管理和启用。
  3. osg::ClipPlane:裁剪平面具体实现类,封装了 OpenGL 裁剪平面的所有功能,提供平面定义、编号设置、参数修改等接口。

核心特性:ClipPlane 属于渲染状态,必须绑定到节点的 osg::StateSet 上才能生效,这也是 OSG 统一管理渲染状态的设计规范。


核心原理

1. 数学基础:平面方程

ClipPlane 基于三维空间平面方程:
Ax+By+Cz+D=0Ax + By + Cz + D = 0Ax+By+Cz+D=0

  • A、B、C:平面法向量,决定平面的朝向和裁剪方向
  • D:平面偏移量,决定平面在空间中的位置

2. OSG 裁剪规则(必记)

OSG 会自动保留平面正面,裁剪平面背面

  • 保留区域:Ax+By+Cz+D>0Ax + By + Cz + D > 0Ax+By+Cz+D>0
  • 裁剪区域:Ax+By+Cz+D<0Ax + By + Cz + D < 0Ax+By+Cz+D<0

简单理解:法向量指向的一侧被保留,反方向被裁剪

3. 核心接口

// 设置裁剪平面方程 (A,B,C,D)
void setClipPlane(double a, double b, double c, double d);

// 设置裁剪平面编号(GPU 支持 0~5 共6个裁剪平面)
void setClipPlaneNum(unsigned int num);

完整实战代码

以下代码实现双裁剪平面对模型的动态剖切,可直接编译运行,注释清晰易懂:

#include <osgViewer/Viewer>
#include <osg/Node>
#include <osg/Group>
#include <osg/ClipPlane>
#include <osg/StateAttribute>
#include <osgDB/ReadFile>
#include <osgUtil/Optimizer>

int main()
{
    // 1. 创建OSG渲染窗口
    osg::ref_ptr<osgViewer::Viewer> viewer = new osgViewer::Viewer();

    // 2. 创建第一个裁剪平面:0x + 1y + 1z + 1 = 0(斜向裁剪)
    osg::ref_ptr<osg::ClipPlane> cp1 = new osg::ClipPlane();
    cp1->setClipPlane(0, 1, 1, 1);  // 平面方程
    cp1->setClipPlaneNum(0);       // 绑定硬件第0号裁剪平面

    // 3. 创建第二个裁剪平面:1x + 0y + 0z + 1 = 0(X轴方向裁剪)
    osg::ref_ptr<osg::ClipPlane> cp2 = new osg::ClipPlane();
    cp2->setClipPlane(1, 0, 0, 1);
    cp2->setClipPlaneNum(1);       // 绑定硬件第1号裁剪平面

    // 4. 创建场景根节点
    osg::ref_ptr<osg::Group> root = new osg::Group();

    // 5. 加载模型(替换为你的模型路径)
    osg::ref_ptr<osg::Node> model = osgDB::readNodeFile("cow.osg");
    if (!model) {
        OSG_WARN << "模型加载失败!" << std::endl;
        return 1;
    }
    root->addChild(model);

    // 6. 启用裁剪平面(核心:将状态绑定到节点)
    root->getOrCreateStateSet()->setAttributeAndModes(cp1, osg::StateAttribute::ON);
    root->getOrCreateStateSet()->setAttributeAndModes(cp2, osg::StateAttribute::ON);

    // 7. 优化场景提升渲染效率
    osgUtil::Optimizer optimizer;
    optimizer.optimize(root);

    // 8. 启动渲染
    viewer->setSceneData(root);
    viewer->realize();
    return viewer->run();
}

在这里插入图片描述

代码运行步骤

  1. 准备 OSG 环境,将 cow.osg(OSG 自带模型)放入程序目录;
  2. 编译运行,即可看到模型被两个平面同时剖切的效果;
  3. 修改 setClipPlane 参数,可实时调整裁剪方向和位置。

经典使用场景

ClipPlane 是三维可视化的刚需工具,凭借高效、灵活的特点,在多个行业广泛应用:

1. 模型剖切与内部查看(最核心场景)

工业设计、机械仿真中,需要查看设备、零件的内部结构,无需修改原始模型,直接用 ClipPlane 实现动态剖切:

  • 汽车发动机内部剖面展示
  • 建筑墙体、管道内部查看
  • 机械设备故障检测

2. 医疗三维可视化

在 CT、MRI 三维重建中,通过裁剪平面实现人体组织、器官的分层查看,辅助医疗诊断:

  • 脑部、心脏三维模型截面显示
  • 骨骼、血管的精准剖切

3. 空间可视区域筛选

大型场景(智慧城市、游戏地图)中,通过裁剪平面限制渲染范围,提升性能:

  • 只显示房间内的模型,裁剪外部场景
  • 隧道、管道内部漫游,裁剪外部无关物体

4. 截面效果制作

生成模型的二维截面,用于测量、标注、工程图纸导出:

  • 机械零件截面尺寸测量
  • 地质模型地层截面展示

5. 特效与视觉增强

影视、游戏中的创意视觉效果:

  • 物体“切割消失”动画
  • 科幻场景中的空间裁剪特效

关键注意事项

  1. 数量限制:OpenGL 标准最多支持 6 个裁剪平面(编号 0~5),满足绝大多数场景需求;
  2. 继承特性:裁剪平面会被子节点继承,设置在根节点可全局生效,设置在子节点可局部裁剪;
  3. 方向控制:修改法向量符号(如 1→-1)可快速切换裁剪方向;
  4. 性能优势:ClipPlane 由 GPU 硬件加速,裁剪效率极高,不影响渲染性能。

总结

osg::ClipPlane 是 OSG 中轻量、高效、通用的三维裁剪工具,依托 StateAttribute 渲染状态体系,完美适配各类三维可视化场景。掌握它的继承关系、平面方程原理和使用方法,就能轻松实现模型剖切、区域筛选、截面展示等核心功能,是 OSG 开发者必备的基础技能。

在这里插入图片描述

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐