// 第一个参数是切割的primitive对象 第二个是四个点的坐标
const ClipRectangle = (clipObj, positions) => {
//计算坐标转换需要用到的矩阵的方法,参数:模型
function getInverseTransform (tileSet) {
let transform
let tmp = tileSet.root.transform
if ((tmp && tmp.equals(Cesium.Matrix4.IDENTITY)) || !tmp) {
// 如果root.transform不存在,则3DTiles的原点变成了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())
}
//对点进行坐标转换的方法
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) {
// 将仅包含经纬度信息的p1,p2,转换为相应坐标系的cartesian3对象
let p1C3 = getOriginCoordinateSystemPoint(p1, inverseTransform)
let p2C3 = getOriginCoordinateSystemPoint(p2, inverseTransform)
// 定义一个垂直向上的向量up
let up = new Cesium.Cartesian3(0, 0, 10)
// right 实际上就是由p1指向p2的向量
let right = Cesium.Cartesian3.subtract(p1C3, p2C3, new Cesium.Cartesian3())
// 计算normal, right叉乘up,得到平面法向量,这个法向量指向right的右侧
let normal = Cesium.Cartesian3.cross(right, up, new Cesium.Cartesian3())
normal = Cesium.Cartesian3.normalize(normal, normal)
//由于已经获得了法向量和过平面的一点,因此可以直接构造Plane,并进一步构造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,// 切面与模型相交线的线宽,如果不需要切面边线,可设置为0
edgeColor: Cesium.Color.WHITE, // 平面切割时模型的边缘颜色
})
clipObj.clippingPlanes = clippingPlanes
}
3D-Tiles 矩形裁切
©著作权归作者所有,转载或内容合作请联系作者
- 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
- 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
- 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
推荐阅读更多精彩内容
- Cesium中文网:http://cesiumcn.org/ | 国内快速访问:http://cesium.coi...
- 本文副标题《当我买了个机械键盘后我陷入了沉思》。 本文所有键盘原型图均采用EXCEL绘制。 前文: 不知道什么时候...