EgisCorp / XDWorld

WebGL 기반 3D GIS 엔진
15 stars 7 forks source link

고스트심볼 객체에 지형결합를 적용시키는 함수가 있을까요? #394

Closed yuuki9 closed 7 months ago

yuuki9 commented 8 months ago

엔진 버전 : 1.59.2

문의 내용 : 고스트심볼 객체에 지형결합를 적용시키는 함수가 있을까요?

YunSumin commented 8 months ago

안녕하세요,

고스트심볼 오브젝트의 위치를 수집하여 각 위치의 고도를 서버 기반으로 반환하여 지형 결합을 적용하실 수 있습니다.

아래 영상은 여섯 개의 고스트 심볼 오브젝트를 고도 300m로 일괄 생성한 뒤 각 위치의 고도를 서버 기반으로 반환하여 결합하는 영상입니다.

https://github.com/EgisCorp/XDWorld/assets/82925313/8e663d6f-f406-407b-82f8-d54def3c6f75

아래는 고스트심볼의 고도를 반환하여 지형과 결합하는 예제 코드입니다.

function mergeTerrain() {

    // 서버로 고도 값을 요청할 위치 리스트
    var positions = [];

    for (var i=0; i<GLOBAL.layer.getObjectCount(); i++) {

        // 오브젝트의 위치 반환 후 리스트에 저장
        var object = GLOBAL.layer.indexAtObject(i);
        var position = object.getPosition();
        positions.push(new Module.JSVector2D(position.Longitude, position.Latitude));
    }

    // 엔진과 연결된 지형 DEM 서버로 해당 위치의 고도 요청
    Module.getTerrain().getServerAltitude({

        level : 13,    // 요청 DEM 레벨 
        positions : positions    // 요청 위치 리스트

    }, function (_result) {

        // 서버로부터 받은 고도를 오브젝트에 적용
        for (var i=0; i<_result.length; i++) {

            var object = GLOBAL.layer.indexAtObject(i);
            if (object != null) {

                // 오브젝트의 위치 반환 후 고도만 변경
                var currentPosition = object.getPosition();
                currentPosition.Altitude = _result[i].altitude;

                // 변경된 위치로 오브젝트 이동
                object.setPosition(currentPosition);
            }
        }
    });
}

서버로부터 반환된 좌표 리스트(_result)의 순서는 요청하는 위치 리스트(positions)의 순서와 동일하게 유지되므로 레이어의 인덱스와 1:1 매칭이 가능합니다. (고도 레벨을 너무 높게 두어 서버에 데이터가 존재하지 않는 경우 고도 값은 null로 반환되오니 참고 부탁 드립니다.)

getServerAltitude API는 1.59.0 (베타 버전의 경우 2.1.0) 버전 부터 사용 하실 수 있습니다.