From 098b0a5d234097c44313a8b149e0c6658fb716da Mon Sep 17 00:00:00 2001 From: jiaojialulu Date: Wed, 27 Dec 2017 17:43:00 +0800 Subject: [PATCH 1/9] modify lib/createSingleTileset.js --- lib/createSingleTileset.js | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/lib/createSingleTileset.js b/lib/createSingleTileset.js index d4baad3..245c23b 100644 --- a/lib/createSingleTileset.js +++ b/lib/createSingleTileset.js @@ -69,15 +69,15 @@ function createSingleTileset(options) { south, east, north, - minHeight, - maxHeight + minHeight + transHeight, + maxHeight + transHeight ] }; } else if (options.box) { boundingVolume = { box : [ - offsetX, -offsetY, height / 2 + minHeight, // center + offsetX, offsetY, height / 2 + minHeight, // center tileWidth / 2, 0, 0, // width 0, tileHeight / 2, 0, // depth 0, 0, height / 2 // height @@ -87,7 +87,7 @@ function createSingleTileset(options) { else if (options.sphere) { boundingVolume = { sphere : [ - offsetX, -offsetY, height / 2 + minHeight, + offsetX, offsetY, height / 2 + minHeight, Math.sqrt(tileWidth * tileWidth / 4 + tileHeight * tileHeight / 4 + height * height / 4) ] }; From ae20fb985a522ea5fca9560ede4fdf5be4ae8f6c Mon Sep 17 00:00:00 2001 From: jiaojialulu Date: Wed, 27 Dec 2017 21:59:19 +0800 Subject: [PATCH 2/9] modify bouding volume --- lib/createSingleTileset.js | 16 +++++++++---- lib/obj2Tileset.js | 47 ++++++++++++++++++++++++++++++++------ 2 files changed, 52 insertions(+), 11 deletions(-) diff --git a/lib/createSingleTileset.js b/lib/createSingleTileset.js index 245c23b..9c0dcba 100644 --- a/lib/createSingleTileset.js +++ b/lib/createSingleTileset.js @@ -8,6 +8,7 @@ var defaultValue = Cesium.defaultValue; var HeadingPitchRoll = Cesium.HeadingPitchRoll; var Matrix4 = Cesium.Matrix4; var Transforms = Cesium.Transforms; +var Cartographic = Cesium.Cartographic; module.exports = createSingleTileset; @@ -58,10 +59,17 @@ function createSingleTileset(options) { var longitudeExtent = metersToLongitude(tileWidth, latitude); var latitudeExtent = metersToLatitude(tileHeight); - var west = longitude - longitudeExtent / 2 + offsetX / tileWidth * longitudeExtent; - var south = latitude - latitudeExtent / 2 - offsetY / tileHeight * latitudeExtent; - var east = longitude + longitudeExtent / 2 + offsetX / tileWidth * longitudeExtent; - var north = latitude + latitudeExtent / 2 - offsetY / tileHeight * latitudeExtent; + // var west = longitude - longitudeExtent / 2 + offsetX / tileWidth * longitudeExtent; + // var south = latitude - latitudeExtent / 2 - offsetY / tileHeight * latitudeExtent; + // var east = longitude + longitudeExtent / 2 + offsetX / tileWidth * longitudeExtent; + // var north = latitude + latitudeExtent / 2 - offsetY / tileHeight * latitudeExtent; + + var center = Cesium.Cartographic.fromCartesian(Matrix4.multiplyByPoint(transformArray, new Cartesian3(offsetX,offsetY,(maxHeight+minHeight)/2);, new Cartesian3()),Cesium.Ellipsoid.WGS84,new Cartographic()); + + var west = car_center.longitude-longitudeExtent / 2; + var south = car_center.latitude-latitudeExtent / 2; + var east = car_center.longitude+longitudeExtent /2; + var north = car_center.latitude+latitudeExtent /2; boundingVolume = { region : [ diff --git a/lib/obj2Tileset.js b/lib/obj2Tileset.js index ce7f1ac..0205154 100644 --- a/lib/obj2Tileset.js +++ b/lib/obj2Tileset.js @@ -22,24 +22,57 @@ function obj2Tileset(objPath, outputpath, options) { var tilePath = path.join(folder, tilesetFolderName, tileFullName); var tilesetPath = path.join(folder, tilesetFolderName, 'tileset.json'); var tilesetOptions = options.tilesetOptions || {}; + + var upAxis = defaultValue(tilesetOptions.gltfUpAxis, 'Y'); if (options.b3dm) { return obj2B3dm(objPath, options) .then(function(result){ var batchTableJson = result.batchTableJson; var minmaxPoint = getPoint3MinMax(batchTableJson.minPoint.concat(batchTableJson.maxPoint)); - var width = minmaxPoint.max[0] - minmaxPoint.min[0]; - var height = minmaxPoint.max[2] - minmaxPoint.min[2]; + var offsetX; + var offsetY; + var minHeight; + var maxHeight; + var width; + var height; + var transHeight; + + var x,y,z; + if(upAxis === 'Y') + { + x = 2; + y = 0; + z = 1; + } + else if(upAxis === 'Z') + { + x = 0; + y = 1; + z = 2; + } + else if(upAxis === 'X') + { + x = 1; + y = 2; + z = 0; + } + + var width = minmaxPoint.max[x] - minmaxPoint.min[x]; + var height = minmaxPoint.max[y] - minmaxPoint.min[y]; width = Math.ceil(width); height = Math.ceil(height); - var offsetX = width / 2 + minmaxPoint.min[0]; - var offsetY = height / 2 + minmaxPoint.min[2]; + var offsetX = width / 2 + minmaxPoint.min[x]; + var offsetY = height / 2 + minmaxPoint.min[y]; + minHeight = minmaxPoint.min[z]; + maxHeight = minmaxPoint.max[z]; + transHeight = -minmaxPoint.min[z]; return new Promise(function(resolve) { tilesetOptions.tileName = tileFullName; tilesetOptions.tileWidth = defaultValue(tilesetOptions.tileWidth, width); tilesetOptions.tileHeight = defaultValue(tilesetOptions.tileHeight, height); - tilesetOptions.transHeight = defaultValue(tilesetOptions.transHeight, -minmaxPoint.min[1]); - tilesetOptions.minHeight = defaultValue(tilesetOptions.minHeight, minmaxPoint.min[1] + tilesetOptions.transHeight); - tilesetOptions.maxHeight = defaultValue(tilesetOptions.maxHeight, minmaxPoint.max[1] + tilesetOptions.transHeight); + tilesetOptions.transHeight = defaultValue(tilesetOptions.transHeight, transHeight); + tilesetOptions.minHeight = defaultValue(tilesetOptions.minHeight, minHeight); + tilesetOptions.maxHeight = defaultValue(tilesetOptions.maxHeight, maxHeight); tilesetOptions.offsetX = defaultValue(tilesetOptions.offsetX, offsetX); tilesetOptions.offsetY = defaultValue(tilesetOptions.offsetY, offsetY); return resolve({ From 5af34b32f71774383f024051853cf9240d90c25b Mon Sep 17 00:00:00 2001 From: jiaojialulu Date: Wed, 27 Dec 2017 22:19:25 +0800 Subject: [PATCH 3/9] modify bounding volume --- lib/createSingleTileset.js | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/lib/createSingleTileset.js b/lib/createSingleTileset.js index 9c0dcba..ba5c197 100644 --- a/lib/createSingleTileset.js +++ b/lib/createSingleTileset.js @@ -64,12 +64,12 @@ function createSingleTileset(options) { // var east = longitude + longitudeExtent / 2 + offsetX / tileWidth * longitudeExtent; // var north = latitude + latitudeExtent / 2 - offsetY / tileHeight * latitudeExtent; - var center = Cesium.Cartographic.fromCartesian(Matrix4.multiplyByPoint(transformArray, new Cartesian3(offsetX,offsetY,(maxHeight+minHeight)/2);, new Cartesian3()),Cesium.Ellipsoid.WGS84,new Cartographic()); + var center = Cesium.Cartographic.fromCartesian(Matrix4.multiplyByPoint(transformArray, new Cartesian3(offsetX,offsetY,(maxHeight+minHeight)/2), new Cartesian3()),Cesium.Ellipsoid.WGS84,new Cartographic()); - var west = car_center.longitude-longitudeExtent / 2; - var south = car_center.latitude-latitudeExtent / 2; - var east = car_center.longitude+longitudeExtent /2; - var north = car_center.latitude+latitudeExtent /2; + var west = center.longitude-longitudeExtent / 2; + var south = center.latitude-latitudeExtent / 2; + var east = center.longitude+longitudeExtent /2; + var north = center.latitude+latitudeExtent /2; boundingVolume = { region : [ From 59aebdf0b0a5e7b6ee4ddc292f6620abe5532dfd Mon Sep 17 00:00:00 2001 From: jiaojialulu Date: Thu, 28 Dec 2017 09:59:16 +0800 Subject: [PATCH 4/9] modify lib/obj2Tileset.js --- lib/obj2Tileset.js | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/lib/obj2Tileset.js b/lib/obj2Tileset.js index 0205154..d9fd378 100644 --- a/lib/obj2Tileset.js +++ b/lib/obj2Tileset.js @@ -40,9 +40,9 @@ function obj2Tileset(objPath, outputpath, options) { var x,y,z; if(upAxis === 'Y') { - x = 2; - y = 0; - z = 1; + x = 1; + y = 2; + z = 0; } else if(upAxis === 'Z') { @@ -52,9 +52,9 @@ function obj2Tileset(objPath, outputpath, options) { } else if(upAxis === 'X') { - x = 1; - y = 2; - z = 0; + x = 2; + y = 0; + z = 1; } var width = minmaxPoint.max[x] - minmaxPoint.min[x]; From 9835552d517ad613d0ec40fdc5298f6ee03134e5 Mon Sep 17 00:00:00 2001 From: jiaojialulu Date: Thu, 28 Dec 2017 10:31:56 +0800 Subject: [PATCH 5/9] modify bounding volume --- lib/obj2Tileset.js | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/lib/obj2Tileset.js b/lib/obj2Tileset.js index d9fd378..0205154 100644 --- a/lib/obj2Tileset.js +++ b/lib/obj2Tileset.js @@ -40,9 +40,9 @@ function obj2Tileset(objPath, outputpath, options) { var x,y,z; if(upAxis === 'Y') { - x = 1; - y = 2; - z = 0; + x = 2; + y = 0; + z = 1; } else if(upAxis === 'Z') { @@ -52,9 +52,9 @@ function obj2Tileset(objPath, outputpath, options) { } else if(upAxis === 'X') { - x = 2; - y = 0; - z = 1; + x = 1; + y = 2; + z = 0; } var width = minmaxPoint.max[x] - minmaxPoint.min[x]; From 3b7322eb9261ebcd4645a23588a42dae45a1e8e4 Mon Sep 17 00:00:00 2001 From: jiaojialulu Date: Thu, 28 Dec 2017 21:21:00 +0800 Subject: [PATCH 6/9] modify bounding volume --- lib/obj2Tileset.js | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/lib/obj2Tileset.js b/lib/obj2Tileset.js index 0205154..b6b78f7 100644 --- a/lib/obj2Tileset.js +++ b/lib/obj2Tileset.js @@ -43,18 +43,24 @@ function obj2Tileset(objPath, outputpath, options) { x = 2; y = 0; z = 1; + offsetX = width / 2 + minmaxPoint.min[x]; + offsetY = -(height / 2 + minmaxPoint.min[y]); } else if(upAxis === 'Z') { x = 0; y = 1; z = 2; + offsetX = width / 2 + minmaxPoint.min[x]; + offsetY = height / 2 + minmaxPoint.min[y]; } else if(upAxis === 'X') { x = 1; y = 2; z = 0; + offsetX = -(width / 2 + minmaxPoint.min[x]); + offsetY = height / 2 + minmaxPoint.min[y]; } var width = minmaxPoint.max[x] - minmaxPoint.min[x]; From 8420952f8d688e9e76da90108058ce06d448e320 Mon Sep 17 00:00:00 2001 From: jiaojialulu Date: Thu, 28 Dec 2017 21:49:03 +0800 Subject: [PATCH 7/9] modify bounding volume --- lib/obj2Tileset.js | 30 ++++++++++++++++++++---------- 1 file changed, 20 insertions(+), 10 deletions(-) diff --git a/lib/obj2Tileset.js b/lib/obj2Tileset.js index b6b78f7..d4e8362 100644 --- a/lib/obj2Tileset.js +++ b/lib/obj2Tileset.js @@ -40,9 +40,13 @@ function obj2Tileset(objPath, outputpath, options) { var x,y,z; if(upAxis === 'Y') { - x = 2; - y = 0; + x = 0; + y = 2; z = 1; + + width = minmaxPoint.max[x] - minmaxPoint.min[x]; + height = minmaxPoint.max[y] - minmaxPoint.min[y]; + offsetX = width / 2 + minmaxPoint.min[x]; offsetY = -(height / 2 + minmaxPoint.min[y]); } @@ -51,24 +55,29 @@ function obj2Tileset(objPath, outputpath, options) { x = 0; y = 1; z = 2; + + width = minmaxPoint.max[x] - minmaxPoint.min[x]; + height = minmaxPoint.max[y] - minmaxPoint.min[y]; + offsetX = width / 2 + minmaxPoint.min[x]; offsetY = height / 2 + minmaxPoint.min[y]; } else if(upAxis === 'X') { - x = 1; - y = 2; + x = 2; + y = 1; z = 0; + + width = minmaxPoint.max[x] - minmaxPoint.min[x]; + height = minmaxPoint.max[y] - minmaxPoint.min[y]; + offsetX = -(width / 2 + minmaxPoint.min[x]); offsetY = height / 2 + minmaxPoint.min[y]; } - var width = minmaxPoint.max[x] - minmaxPoint.min[x]; - var height = minmaxPoint.max[y] - minmaxPoint.min[y]; - width = Math.ceil(width); - height = Math.ceil(height); - var offsetX = width / 2 + minmaxPoint.min[x]; - var offsetY = height / 2 + minmaxPoint.min[y]; + width = Math.ceil(width); + height = Math.ceil(height); + minHeight = minmaxPoint.min[z]; maxHeight = minmaxPoint.max[z]; transHeight = -minmaxPoint.min[z]; @@ -81,6 +90,7 @@ function obj2Tileset(objPath, outputpath, options) { tilesetOptions.maxHeight = defaultValue(tilesetOptions.maxHeight, maxHeight); tilesetOptions.offsetX = defaultValue(tilesetOptions.offsetX, offsetX); tilesetOptions.offsetY = defaultValue(tilesetOptions.offsetY, offsetY); + //console.log(tilesetOptions); return resolve({ b3dm : result.b3dm, batchTableJson: result.batchTableJson, From c225db47aff994f8d8242587e7c2c18975aefa50 Mon Sep 17 00:00:00 2001 From: jiaojialulu Date: Wed, 3 Jan 2018 18:04:20 +0800 Subject: [PATCH 8/9] modify combine --- lib/combineTileset.js | 97 ++++++++++++++++++++++++++++++++++--------- 1 file changed, 77 insertions(+), 20 deletions(-) diff --git a/lib/combineTileset.js b/lib/combineTileset.js index f879f5d..c2868fc 100644 --- a/lib/combineTileset.js +++ b/lib/combineTileset.js @@ -3,8 +3,11 @@ var Cesium = require('cesium'); var fsExtra = require('fs-extra'); var path = require('path'); +var Matrix4 = Cesium.Matrix4; var defaultValue = Cesium.defaultValue; var defined = Cesium.defined; +var Cartesian3 = Cesium.Cartesian3; +var Cartographic = Cesium.Cartographic; module.exports = combineTileset; @@ -20,6 +23,8 @@ function combineTileset(options) { var south = Number.POSITIVE_INFINITY; var north = Number.NEGATIVE_INFINITY; var east = Number.NEGATIVE_INFINITY; + var minBox = [Number.POSITIVE_INFINITY,Number.POSITIVE_INFINITY,Number.POSITIVE_INFINITY]; + var maxBox = [Number.NEGATIVE_INFINITY,Number.NEGATIVE_INFINITY,Number.NEGATIVE_INFINITY]; var minheight = Number.POSITIVE_INFINITY; var maxheight = Number.NEGATIVE_INFINITY; var inputDir = defaultValue(options.inputDir, './'); @@ -32,6 +37,8 @@ function combineTileset(options) { inputDir = path.normalize(inputDir); outputTileset = path.normalize(outputTileset); var outputDir = path.dirname(outputTileset); + var gltfUpAxis = "Y"; + var transform; getJsonFiles(inputDir, jsonFiles); jsonFiles.forEach(function(jsonFile) { @@ -40,8 +47,10 @@ function combineTileset(options) { if(!json.root) {return Promise.resolve();} var boundingVolume = json.root.boundingVolume; var geometricError = json.geometricError; + transform = json.root.transform; var refine = json.root.refine; + gltfUpAxis = json.asset.gltfUpAxis; if (defined(boundingVolume) && defined(geometricError)) { // Use external tileset instand of b3dm. var url = path.relative(outputDir, jsonFile); @@ -55,6 +64,21 @@ function combineTileset(options) { north = Math.max(north, boundingVolume.region[3]); minheight = Math.min(minheight, boundingVolume.region[4]); maxheight = Math.max(maxheight, boundingVolume.region[5]); + }else if(boundingVolume.box) + { + var tempMin = [boundingVolume.box[0]-boundingVolume.box[3]/2, + boundingVolume.box[1]-boundingVolume.box[7]/2, + boundingVolume.box[2]-boundingVolume.box[11]/2]; + var tempMax = [boundingVolume.box[0]+boundingVolume.box[3]/2, + boundingVolume.box[1]+boundingVolume.box[7]/2, + boundingVolume.box[2]+boundingVolume.box[11]/2]; + minBox = [tempMin[0]maxBox[0]?tempMax[0]:maxBox[0], + tempMax[1]>maxBox[1]?tempMax[1]:maxBox[1], + tempMax[2]>maxBox[2]?tempMax[2]:maxBox[2]]; } var child = { @@ -76,29 +100,62 @@ function combineTileset(options) { }); return Promise.all(promises).then(function() { - var tileset = { - 'asset': { - 'version': '0.0', - 'tilesetVersion': '1.0.0-obj23dtiles', - }, - 'geometricError': geometricError, - 'root': { - 'boundingVolume': { - 'region': [ - west, - south, - east, - north, - minheight, - maxheight - ] + var tileset; + if(minBox === [Number.POSITIVE_INFINITY,Number.POSITIVE_INFINITY,Number.POSITIVE_INFINITY]) + { + tileset = { + 'asset': { + 'version': '0.0', + 'tilesetVersion': '1.0.0-obj23dtiles', + 'gltfUpAxis': gltfUpAxis }, - 'refine': 'ADD', 'geometricError': geometricError, - 'children': children + 'root': { + 'boundingVolume': { + 'region': [ + west, + south, + east, + north, + minheight, + maxheight + ] + }, + 'refine': 'ADD', + 'geometricError': geometricError, + 'children': children + } + }; + }else + { + var center = new Cartesian3((minBox[0]+maxBox[0])/2,(minBox[1]+maxBox[1])/2,(minBox[2]+maxBox[2])/2); + if(transform !== undefined) + { + var transformArray = (defined(transform) && !Matrix4.equals(transform, Matrix4.IDENTITY)) ? Matrix4.pack(transform, new Array(16)) : undefined; + center = Matrix4.multiplyByPoint(transformArray, center, new Cartesian3()); } - }; - + tileset = { + 'asset': { + 'version': '0.0', + 'tilesetVersion': '1.0.0-obj23dtiles', + 'gltfUpAxis': gltfUpAxis + }, + 'geometricError': geometricError, + 'root': { + 'boundingVolume': { + 'box': [ + center.x,center.y,center.z, + maxBox[0]-minBox[0],0,0, + 0,maxBox[1]-minBox[1],0, + 0,0,maxBox[2]-minBox[2] + ] + }, + 'refine': 'ADD', + 'geometricError': geometricError, + 'children': children + } + }; + } return Promise.resolve({ tileset: tileset, output: outputTileset From ebc53db06ab80b2c73a5da1f99d247406d1ad359 Mon Sep 17 00:00:00 2001 From: jiaojialulu Date: Wed, 3 Jan 2018 20:31:36 +0800 Subject: [PATCH 9/9] modify transform --- lib/createSingleTileset.js | 4 +++- lib/obj2Tileset.js | 5 +++-- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/lib/createSingleTileset.js b/lib/createSingleTileset.js index ba5c197..1318dd1 100644 --- a/lib/createSingleTileset.js +++ b/lib/createSingleTileset.js @@ -47,8 +47,10 @@ function createSingleTileset(options) { var properties = defaultValue(options.properties, undefined); var geometricError = defaultValue(options.geometricError, 200.0); var tileTransform = wgs84Transform(longitude, latitude, transHeight); - var transform = defaultValue(options.transfrom, tileTransform); + var transform = defaultValue(options.transform, tileTransform); + var transformArray = (defined(transform) && !Matrix4.equals(transform, Matrix4.IDENTITY)) ? Matrix4.pack(transform, new Array(16)) : undefined; + var height = maxHeight - minHeight; if(!(options.region||options.box||options.sphere)) { diff --git a/lib/obj2Tileset.js b/lib/obj2Tileset.js index d4e8362..df0e28d 100644 --- a/lib/obj2Tileset.js +++ b/lib/obj2Tileset.js @@ -22,7 +22,7 @@ function obj2Tileset(objPath, outputpath, options) { var tilePath = path.join(folder, tilesetFolderName, tileFullName); var tilesetPath = path.join(folder, tilesetFolderName, 'tileset.json'); var tilesetOptions = options.tilesetOptions || {}; - + var upAxis = defaultValue(tilesetOptions.gltfUpAxis, 'Y'); if (options.b3dm) { return obj2B3dm(objPath, options) @@ -90,7 +90,8 @@ function obj2Tileset(objPath, outputpath, options) { tilesetOptions.maxHeight = defaultValue(tilesetOptions.maxHeight, maxHeight); tilesetOptions.offsetX = defaultValue(tilesetOptions.offsetX, offsetX); tilesetOptions.offsetY = defaultValue(tilesetOptions.offsetY, offsetY); - //console.log(tilesetOptions); + tilesetOptions.transform = defaultValue(tilesetOptions.transform, undefined); + return resolve({ b3dm : result.b3dm, batchTableJson: result.batchTableJson,