3D-Tiles 矩形裁切

// 第一個(gè)參數(shù)是切割的primitive對(duì)象  第二個(gè)是四個(gè)點(diǎn)的坐標(biāo)
const ClipRectangle = (clipObj, positions) => {
    //計(jì)算坐標(biāo)轉(zhuǎn)換需要用到的矩陣的方法,參數(shù):模型
    function getInverseTransform (tileSet) {
        let transform
        let tmp = tileSet.root.transform
        if ((tmp && tmp.equals(Cesium.Matrix4.IDENTITY)) || !tmp) {
            // 如果root.transform不存在,則3DTiles的原點(diǎn)變成了boundingSphere.center
            transform = Cesium.Transforms.eastNorthUpToFixedFrame(tileSet.boundingSphere.center)
        } else {
            transform = Cesium.Matrix4.fromArray(tileSet.root.transform)
        }
        return Cesium.Matrix4.inverseTransformation(transform, new Cesium.Matrix4())
    }

    //對(duì)點(diǎn)進(jìn)行坐標(biāo)轉(zhuǎn)換的方法
    function getOriginCoordinateSystemPoint (point, inverseTransform) {
        let val = Cesium.Cartesian3.fromDegrees(point.lng, point.lat)
        return Cesium.Matrix4.multiplyByPoint(inverseTransform, val, new Cesium.Cartesian3(0, 0, 0))
    }

    function createPlane (p1, p2, inverseTransform) {
        // 將僅包含經(jīng)緯度信息的p1,p2,轉(zhuǎn)換為相應(yīng)坐標(biāo)系的cartesian3對(duì)象
        let p1C3 = getOriginCoordinateSystemPoint(p1, inverseTransform)
        let p2C3 = getOriginCoordinateSystemPoint(p2, inverseTransform)
        
        // 定義一個(gè)垂直向上的向量up
        let up = new Cesium.Cartesian3(0, 0, 10)
        //  right 實(shí)際上就是由p1指向p2的向量
        let right = Cesium.Cartesian3.subtract(p1C3, p2C3, new Cesium.Cartesian3())
        
        // 計(jì)算normal, right叉乘up,得到平面法向量,這個(gè)法向量指向right的右側(cè)
        let normal = Cesium.Cartesian3.cross(right, up, new Cesium.Cartesian3())
        normal = Cesium.Cartesian3.normalize(normal, normal)

        //由于已經(jīng)獲得了法向量和過平面的一點(diǎn),因此可以直接構(gòu)造Plane,并進(jìn)一步構(gòu)造ClippingPlane
        let planeTmp = Cesium.Plane.fromPointNormal(p1C3, normal)
        return Cesium.ClippingPlane.fromPlane(planeTmp)
    }

    var latLngArr = positions

    var clippingPlanesss0 = createPlane(latLngArr[0], latLngArr[1], getInverseTransform(clipObj))
    var clippingPlanesss1 = createPlane(latLngArr[1], latLngArr[2], getInverseTransform(clipObj))
    var clippingPlanesss2 = createPlane(latLngArr[2], latLngArr[3], getInverseTransform(clipObj))
    var clippingPlanesss3 = createPlane(latLngArr[3], latLngArr[0], getInverseTransform(clipObj))

    var plane0 = new Cesium.ClippingPlane(clippingPlanesss0.normal, clippingPlanesss2.distance * -1)
    var plane1 = new Cesium.ClippingPlane(clippingPlanesss1.normal, clippingPlanesss3.distance * -1)
    var plane2 = new Cesium.ClippingPlane(clippingPlanesss2.normal, clippingPlanesss0.distance * -1)
    var plane3 = new Cesium.ClippingPlane(clippingPlanesss3.normal, clippingPlanesss1.distance * -1)
    
    let clippingPlanes = new Cesium.ClippingPlaneCollection({
        // 切面
        planes: [plane0, plane1, plane2, plane3],
        unionClippingRegions: false,
        edgeWidth: 2.0,// 切面與模型相交線的線寬,如果不需要切面邊線,可設(shè)置為0
        edgeColor: Cesium.Color.WHITE, // 平面切割時(shí)模型的邊緣顏色
    })
    
    clipObj.clippingPlanes = clippingPlanes
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容