// 第一個(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
}
3D-Tiles 矩形裁切
?著作權(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ù)。
【社區(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)容
- Cesium中文網(wǎng):http://cesiumcn.org/ | 國內(nèi)快速訪問:http://cesium.coi...
- 本文副標(biāo)題《當(dāng)我買了個(gè)機(jī)械鍵盤后我陷入了沉思》。 本文所有鍵盤原型圖均采用EXCEL繪制。 前文: 不知道什么時(shí)候...
- 用d3js創(chuàng)建一個(gè)簡單的矩形 前言 本文并不是針對(duì)初學(xué)者的教程, 而是對(duì)矩形圖繪制的基本流程做一個(gè)總結(jié), 整理一下...