function offsetsToCartesians(vertices, cartographicOrigin) { const positions = new Float64Array(vertices.length); for (let i = 0; i < positions.length; i += 3) { positions[i] = vertices[i] + cartographicOrigin.x; positions[i + 1] = vertices[i + 1] + cartographicOrigin.y; positions[i + 2] = vertices[i + 2] + cartographicOrigin.z; } for (let i = 0; i < positions.length; i += 3) { // @ts-ignore Ellipsoid.WGS84.cartographicToCartesian(positions.subarray(i, i + 3), scratchVector); positions[i] = scratchVector.x; positions[i + 1] = scratchVector.y; positions[i + 2] = scratchVector.z; } return positions; }
// Called during initialize Tileset to initialize the tileset's cartographic center (longitude, latitude) and zoom. _calculateViewProps() { const root = this.root; const {center} = root.boundingVolume; // TODO - handle all cases if (!center) { // eslint-disable-next-line console.warn('center was not pre-calculated for the root tile'); this.cartographicCenter = new Vector3(); this.zoom = 1; return; } this.cartographicCenter = Ellipsoid.WGS84.cartesianToCartographic(center, new Vector3()); this.cartesianCenter = center; this.zoom = getZoomFromBoundingVolume(root.boundingVolume); }
function parsePositions(attribute, tile) { const mbs = tile.mbs; const value = attribute.value; const enuMatrix = new Matrix4(); const cartographicOrigin = new Vector3(mbs[0], mbs[1], mbs[2]); const cartesianOrigin = new Vector3(); Ellipsoid.WGS84.cartographicToCartesian(cartographicOrigin, cartesianOrigin); Ellipsoid.WGS84.eastNorthUpToFixedFrame(cartesianOrigin, enuMatrix); attribute.value = offsetsToCartesians(value, cartographicOrigin); return { enuMatrix, fixedFrameToENUMatrix: enuMatrix.invert(), cartographicOrigin, cartesianOrigin }; }
function commonSpacePlanesToWGS84(viewport, viewportCenterCartesian) { // Extract frustum planes based on current view. const frustumPlanes = viewport.getFrustumPlanes(); let i = 0; for (const dir in frustumPlanes) { const plane = frustumPlanes[dir]; const distanceToCenter = plane.normal.dot(viewport.center); scratchPosition .copy(plane.normal) .scale(plane.distance - distanceToCenter) .add(viewport.center); const cartographicPos = viewport.unprojectPosition(scratchPosition); const cartesianPos = Ellipsoid.WGS84.cartographicToCartesian(cartographicPos, new Vector3()); cullingVolume.planes[i++].fromPointNormal( cartesianPos, // Want the normal to point into the frustum since that's what culling expects scratchVector.copy(viewportCenterCartesian).subtract(cartesianPos) ); } }
export function normalizeTileData(tile, options, context) { tile.url = context.url; if (tile.featureData) { tile.featureUrl = `${tile.url}/${tile.featureData[0].href}`; } if (tile.geometryData) { tile.contentUrl = `${tile.url}/${tile.geometryData[0].href}`; } if (tile.textureData) { tile.textureUrl = `${tile.url}/${tile.textureData[0].href}`; } scratchCenter.copy(tile.mbs); const centerCartesian = Ellipsoid.WGS84.cartographicToCartesian(tile.mbs.slice(0, 3)); tile.boundingVolume = { sphere: [...centerCartesian, tile.mbs[3]] }; tile.lodMetricType = tile.lodSelection[0].metricType; tile.lodMetricValue = tile.lodSelection[0].maxError; tile.transformMatrix = tile.transform; tile.type = TILE_TYPE.MESH; // TODO only support replacement for now tile.refine = TILE_REFINEMENT.REPLACE; return tile; }
t.ok(results.cullingVolume.planes.length, 6, 'Should have 6 planes.'); const viewportCenterCartesian = Ellipsoid.WGS84.cartographicToCartesian( [viewport.longitude, viewport.latitude, 0], new Vector3()
const viewportCenterCartesian = Ellipsoid.WGS84.cartographicToCartesian( viewportCenterCartographic, new Vector3() ); const enuToFixedTransform = Ellipsoid.WGS84.eastNorthUpToFixedFrame(viewportCenterCartesian); const cameraPositionCartesian = Ellipsoid.WGS84.cartographicToCartesian( cameraPositionCartographic, new Vector3()