首页 > 其他分享 >Cesium:模型裁切

Cesium:模型裁切

时间:2023-05-19 17:45:53浏览次数:32  
标签:裁切 Cartesian3 模型 var 平面 Cesium new

关于平面裁切,官网有两个例子,3D Tiles裁切和地形裁切

本文实现的功能:由两点确定一条直线,给定裁切位置,对3D Tiles数据做裁切。
裁切效果:

要实现平面裁切,首先需要创建裁切平面
1、ClippingPlane

new Cesium.ClippingPlane(normal, distance)

名称 默认值
normal 平面的法线方向。
distance 原点到平面的最短距离。距离符号决定了原点在平面的哪一侧。如果距离为正,则原点在法向的半空间中;如果距离为负,则原点在法向反方向的半空间中;如果距离为零,则平面通过原点。

平面法向所在坐标系是以正东方为x轴正方向,正北方为y轴正方向,正上面为z轴正方向的座标系。(局部坐标
平面法向确定了裁切面的方向,距离通过原点到平面的距离控制,原点在tileset中就是模型的原点。

然后,创建裁切平面集合,
2、ClippingPlaneCollection

new Cesium.ClippingPlaneCollection(options)

名称 默认值 描述
planes ClippingPlane,用于在每个平面的外部选择性地禁用渲染 的对象数组。
enabled true 确定剪切平面是否处于活动状态。
modelMatrix 4x4变换矩阵,指定相对于剪裁平面原始座标系的附加变换。
unionClippingRegions false 如果为true,则位于任何平面外部的区域将被剪裁,即取并集。否则,位于每个平面的外部区域才会被剪裁,即取交集。
edgeColor Color.WHITE 用于突出显示裁剪对象的边缘的颜色。
edgeWidth 0 剪裁对象的边缘的高光的宽度(以像素为单位)。

核心代码:

function clipPlane(viewer, tileset) {
    this.viewer = viewer;
    this.tileset = tileset;
    this.clipPlane;
    this.origin;
    this.size;
    this.init();
}

clipPlane.prototype.init = function() {
    // 根据两个点的坐标计算方向向量
    var point1 = new Cesium.Cartesian3(1214947.495184834,-4736223.627644073,4081719.8535693167);
    var point2 = new Cesium.Cartesian3(1215009.7319983065, -4736271.158724633, 4081646.6675580707);
    //中点坐标
    var midpoint = new Cesium.Cartesian3((point1.x + point2.x) / 2, (point1.y + point2.y) / 2, (point1.z + point2.z) / 2);
    // 计算连线向量
    var vector = Cesium.Cartesian3.subtract(point2, point1, new Cesium.Cartesian3());
    //椭球面单位法向量
    var normalVector = Cesium.Cartesian3.cross(midpoint, vector, new Cesium.Cartesian3());
    var unitVector = Cesium.Cartesian3.normalize(normalVector, new Cesium.Cartesian3());
    //模型包围盒中心点坐标
    this.origin = this.tileset.boundingSphere.center;
    //包围盒半径,用于确定绘制的裁切面大小
    this.size = this.tileset.boundingSphere.radius;
    //局部坐标到世界坐标的转换矩阵
    var northeastup = Cesium.Transforms.eastNorthUpToFixedFrame(this.origin);
    //取逆得世界坐标到局部坐标的转换矩阵
    var inverse;
    //为了应对某些数据root的变换为单位阵的情况
    var rootTransform = this.tileset.root.transform;
    if (rootTransform.equals(Cesium.Matrix4.IDENTITY)) {
        rootTransform = northeastup;
        inverse = Cesium.Matrix4.inverse(northeastup, new Cesium.Matrix4);
    }else{
        inverse = Cesium.Matrix4.inverse(rootTransform, new Cesium.Matrix4);
    }
    
    //计算距离
    let line = new Cesium.Cartesian3(this.origin.x - point1.x, this.origin.y - point1.y, this.origin.z - point1.z);
    let distance = Cesium.Cartesian3.dot(line, unitVector);
    //tileset模型用的是局部坐标,所以给的方向也要时局部坐标系下的
    let direction = Cesium.Matrix4.multiplyByPointAsVector(inverse, unitVector, new Cesium.Cartesian3());
    //创建裁切平面
    this.clipPlane = new Cesium.ClippingPlane(direction, distance);
    //创建裁切平面集合
    var clippingPlanes = new Cesium.ClippingPlaneCollection({
        planes: [
            this.clipPlane
        ],
        edgeWidth: 1.0
    });

    //添加面
    this.planeEntity = this.viewer.entities.add({
        position: this.origin,
        plane: {
            dimensions: new Cesium.Cartesian2(
                this.size * 2,
                this.size * 2
            ),
            material: Cesium.Color.WHITE.withAlpha(0.3),
            plane: clippingPlanes.get(0),
            outline: true,
            outlineColor: Cesium.Color.WHITE,
        },
    });

    //添加点
    viewer.entities.add({
        position: point1,
        point: {
            pixelSize: 5
        }
    })
    viewer.entities.add({
        position: point2,
        point: {
            pixelSize: 5
        }
    })

    //添加线
    var lineEntity = viewer.entities.add({
        polyline: {
            positions: [point1, point2],
            width: 2,
            material: Cesium.Color.RED
        }
    });

    this.tileset.clippingPlanes = clippingPlanes;
}

参考Cesium——平面裁切

标签:裁切,Cartesian3,模型,var,平面,Cesium,new
From: https://www.cnblogs.com/marshban/p/17415877.html

相关文章

  • 矩池云教程|体验 OpenAI 最近推出的 3D 生成模型 Shap-E!
    Shap-E是由OpenAI最近推出的3D生成模型,使用者可以通过简单的文字或图像进行三维模型的生成,OpenAI认为相比于点云的生成模型Point-E,Shap-E的收敛更快。本文将展示如何在矩池云上体验3D模型生成。Shap-E:https://github.com/openai/shap-e矩池云:https://matpool.com/1、安装......
  • 如何进行测试分析与设计-HTSM启发式测试策略模型 | 京东云技术团队
    测试,没有分析与设计就失去了灵魂;测试人员在编写用例之前,该如何进行测试分析与设计呢?上次在《测试的底层逻辑》中讲到了【输入输出测试模型】,还讲到了【2W+1H测试分析法】,但2W1H分析法是初步的分析方法,具体在测试中如何落地,还需要更细的设计。今天就给大家介绍一下由测试领域专家......
  • Tensorflow变量管理及模型持久化,实现实现线性回归
    变量管理随着神经网络的结构更加复杂,参数更多时,需要一个更好的方式来传递和管理变量。在TF中提供了通过变量的名字来创建或者获取一个变量的机制,通过这个机制不同函数可以直接通过变量的名字来直接使用变量。这机制主要是通过tf.get_variable和tf.variable_scope实现的。tf.get_......
  • text-generation-webui安装部署的过程-window版本,最后成功运行OPT大模型
    环境:操作系统:windows11RAM:16.0GB处理器:AMDRyzen3700X显卡:NVIDIAGeForceGTX10603GB 1、从上面github下载window版本的一键安装部署的zip。地址:https://github.com/oobabooga/text-generation-webui/2、根据github上步骤,一键安装。  3、等待安装完之后,配置pyt......
  • 互联网开发中六个思维模型
    一、邓宁-克鲁格效应1、内容邓宁-克鲁格效应表明,没有经验的人往往会高估自己的能力,而有经验的人往往会低估自己的能力。你不擅长某件事,但你会认为你擅长它。如果你擅长某事,你认为你不擅长-这可能导致冒名顶替综合症,这让你怀疑自己的能力,以至于你在其他具有相似技能的人中感到......
  • 【JMM内存模型-4】JMM内存模型之CPU缓存策略-jmmcpu4
    title:【JMM内存模型-4】JMM内存模型之CPU缓存策略date:2021-11-1713:27:48.139updated:2021-12-2617:43:10.442url:https://www.yby6.com/archives/jmmcpu4categories:-并发编程-JMM内存模型tags:-并发编程CPU缓存策略原理缓存概述CPU为了提升执行效率,减少C......
  • 结合实例,解读华为云数字工厂信息模型配置器
    摘要:结合一个实际的“生产执行管理”场景涉及的相关业务数据对象,系统介绍了华为云数字工厂平台的“信息模型”配置器的使用方法,实现对相关业务对象的数据建模。本文分享自华为云社区《数字工厂深入浅出系列(二):信息模型配置器的使用方法介绍》,作者:云起MAE。华为云数字工厂平台,采......
  • 多路复用IO模型和非阻塞IO模型的区别?
    常见的LinuxIO模型:阻塞IO模型:当应用程序调用read或write等IO操作时,如果内核没有准备好数据,那么应用程序就会一直阻塞等待,直到内核准备好数据后才会返回。在这种模型下,应用程序通常只能同时处理一个连接,效率较低。非阻塞IO模型:当应用程序调用read或write等IO操作后,如果内核没有......
  • 百度飞桨(PaddlePaddle) - PP-OCRv3 文字检测识别系统 Paddle Inference 模型推理
    PaddleInference模型推理流程分别介绍文字检测、方向分类器和文字识别3个模型,基于PaddleInference的推理过程。PaddleInference的Python离线推理离线推理,即在特定机器上部署的代码只能在这台机器上使用,无法通过其他机器进行访问使用whl包预测推理“WHL”是“WHeeL”......
  • 点、线、面、体、魂——企业精益数字化的五阶段模型
     制造业精益数字化是企业精益管理实践与数字化技术的深度融合与相互赋能,其实现路径主要包括“点、线、面、体、魂”五个阶段以及每个阶段所匹配的三层次数字技术。精益数字化的关键驱动力是企业精益实践的不断迭代升级,并在该过程中辅以适配的数字技术。部分典型制造企业通过......