2022년 7월 11일 월요일

Cesium 3D와 콜럼버스뷰일때 mouse pick 처리 예제

/*
 * 선택된 개체의 id가 주어진 id와 다른지 여부
 * @param       pPick
 * @param       pId
 */
function isNotExist(pPick, pId) {
    if (Cesium['defined'](pPick['id'])) {
        const id = pPick['id'];
        if (id['_noMousePosition'])
            return false;
        if (pId && id == pId)
            return false;
    }
    if (Cesium['defined'](pPick['primitive'])) {
        const primitive = pPick['primitive'];
        if (primitive['_noMousePosition'])
            return false;
        if (pId && primitive == pId)
            return false;
    }
    return true;
}

/*
 * 마우스의 위치가 주어진 id와 다르다면 마우스의 좌표를 반환
 * @param       pScene
 * @param       pPosition
 * @param       pId
 */
function getCurrentMousePosition(pScene, pPosition, pId) {
    let position, pick = pScene['pick'](pPosition);

    //개체가 선택되었고 주어진 id를 가지는 경우
    if (pScene['pickPositionSupported'] && Cesium['defined'](pick) && isNotExist(pick, pId)) {
        position = pScene['pickPosition'](pPosition);
        if (Cesium['defined'](position)) {
            const cartesian = Cesium['Cartographic']['fromCartesian'](position),
            height = cartesian['height'];

            if (height >= 0)
                return position;
            if (!Cesium['defined'](pick['id']) && (height >= -500))
                return position;
        }
    }

    //현재 장면이 3D(지구)인 경우
    if (pScene['mode'] === Cesium['SceneMode']['SCENE3D']) {
        const pickRay = pScene['camera']['getPickRay'](pPosition);
        position = pScene['globe']['pick'](pickRay, pScene);
    }
    //현재 장면이 콜럼버스뷰 or 평면지도인 경우
    else {
        position = pScene['camera']['pickEllipsoid'](pPosition, pScene['globe']['ellipsoid']);
    }

    return position;
}