2018년 10월 16일 화요일

Cesium 지도 위에 tileset 모델이 잘 안되던 문제 수정

Cesium Js에서 tileset으로 변환된 모델을 지도상에 올렸다. 그런데 무슨 이유인지 같은 형식의 코드이지만 잘 보였던 모델이 나타나지 않는 문제가 생겼다.

잘 써오던 코드 (1.45 버전)

var tileset = viewer.scene.primitives.add(new Cesium.Cesium3DTileset({
    uri: '/data/tileset.json',
    maximumMemoryUsage : 768,
    skipLevelOfDetail : false,
    baseScreenSpaceError : 1024,
    skipScreenSpaceErrorFactor : 16,
    skipLevels : 1,
    immediatelyLoadDesiredLevelOfDetail : false,
    loadSiblings : false,
    cullWithChildrenBounds : true
}));
tileset.readyPromise.then(function(tileset) {
    var heightOffset = 28; //타일 고도 : 지형이 있을때
    var boundingSphere = tileset.boundingSphere;
    var cartographic = Cesium.Cartographic.fromCartesian(boundingSphere.center);
    var surface = Cesium.Cartesian3.fromRadians(cartographic.longitude, cartographic.latitude, 0.0);
    var offset = Cesium.Cartesian3.fromRadians(cartographic.longitude, cartographic.latitude, heightOffset);
    var translation = Cesium.Cartesian3.subtract(offset, surface, new Cesium.Cartesian3());
    tileset.modelMatrix = Cesium.Matrix4.fromTranslation(translation);
    tileset.show = true; //모델 보이기
});

수정해서 성공한 코드 (1.50 버전)

var tileset = new Cesium.Cesium3DTileset({
    url: '/data/tileset.json',
    maximumMemoryUsage : 768,
    skipLevelOfDetail : false,
    baseScreenSpaceError : 1024,
    skipScreenSpaceErrorFactor : 16,
    skipLevels : 1,
    immediatelyLoadDesiredLevelOfDetail : false,
    loadSiblings : false,
    cullWithChildrenBounds : true
});
viewer.scene.primitives.add(tileset);
tileset.readyPromise.then(function(tileset) {
    var heightOffset = 28; //타일 고도 : 지형이 있을때
    var boundingSphere = tileset.boundingSphere;
    var cartographic = Cesium.Cartographic.fromCartesian(boundingSphere.center);
    var surface = Cesium.Cartesian3.fromRadians(cartographic.longitude, cartographic.latitude, 0.0);
    var offset = Cesium.Cartesian3.fromRadians(cartographic.longitude, cartographic.latitude, heightOffset);
    var translation = Cesium.Cartesian3.subtract(offset, surface, new Cesium.Cartesian3());
    tileset.modelMatrix = Cesium.Matrix4.fromTranslation(translation);
    tileset.show = true; //모델 보이기
});