DEV Community

Cover image for How to consume 3D Tiles (pnts) with Cesium
Hidenori FUJIMURA
Hidenori FUJIMURA

Posted on

How to consume 3D Tiles (pnts) with Cesium

I am developing a site to consume 3D Tiles of PNTS (Point Cloud Tiles) with Cesium. Here is the code.

<html>
<head>
<meta charset="UTF-8">
<script src="https://cesium.com/downloads/cesiumjs/releases/1.102/Build/Cesium/Cesium.js"></script>
<script src="https://frogcat.github.io/cesium-hash/cesium-hash.js"></script>
<link href="https://cesium.com/downloads/cesiumjs/releases/1.102/Build/Cesium/Widgets/widgets.css" rel="stylesheet"></link>
<style>
#cesiumContainer { position: absolute; top: 0; left: 0; height: 100%; width: 100%; margin: 0; 
  overflow: hidden; padding: 0; font-family: sans-serif; }
html { height: 100%; }
body { padding: 0; margin: 0; overflow: hidden; height: 100%; }
</style>
</head>
<body>
<div id="cesiumContainer"></div>
<script>
Cesium.Ion.defaultAccessToken = "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJqdGkiOiI5N2UyMjcwOS00MDY1LTQxYjEtYjZjMy00YTU0ZTg5MmViYWQiLCJpZCI6ODAzMDYsImlhdCI6MTY0Mjc0ODI2MX0.dkwAL1CcljUV7NA7fDbhXXnmyZQU_c-G5zRx8PtEcxE"
const viewer = new Cesium.Viewer("cesiumContainer", {
  animation: false,
  homeButton: false,
  navigationHelpButton: false,
  sceneModePicker: false,
  timeline: false
})
viewer.scene.imageryLayers.addImageryProvider(imageProvider)
viewer.clock.currentTime = Cesium.JulianDate.fromIso8601("2023-03-21T12:00")
viewer.scene.globe.depthTestAgainstTerrain = true

const searchParams = new URLSearchParams(window.location.search)
let url = searchParams.get('tileset') || 'https://d21pj9gigeop84.cloudfront.net/data/point-cloud/lp-2022/22302_kawazu-cho/tileset.json'

const tileset = new Cesium.Cesium3DTileset({
  url: url,
})
tileset.maximumScreenSpaceError = 16
tileset.style = new Cesium.Cesium3DTileStyle({pointSize: 3});
tileset.pointCloudShading.attenuation = false
tileset.pointCloudShading.geometricErrorScale = 1
viewer.scene.primitives.add(tileset)

viewer.camera.moveEnd.addEventListener(() => {
  location.hash = Cesium.Hash.encode(viewer)
})

const credit = new Cesium.Credit('Virtual Shizuoka and/or 東京都デジタルツイン実現プロジェクト')
viewer.scene.frameState.creditDisplay.addDefaultCredit(credit)

if (Cesium.Hash.decode(location.hash) == null) {
  tileset.readyPromise.then(function () {
    viewer.zoomTo(
      tileset, 
      new Cesium.HeadingPitchRange(
        0.0, -0.5, 
        tileset.boundingSphere.radius / 4)
    )
    location.hash = Cesium.Hash.encode(viewer)
  })
} else {
  Cesium.Hash(viewer)
}
</script>
</body>
</html>
Enter fullscreen mode Exit fullscreen mode

See Also

Top comments (0)