Skip to content

Commit

Permalink
refactor(#9): restructure index.html for cleaner project setup
Browse files Browse the repository at this point in the history
  • Loading branch information
adriahso committed Sep 20, 2025
1 parent 5f45df7 commit 305ec8b
Show file tree
Hide file tree
Showing 6 changed files with 172 additions and 159 deletions.
160 changes: 2 additions & 158 deletions index.html
Original file line number Diff line number Diff line change
Expand Up @@ -69,163 +69,7 @@
<div id="potree_sidebar_container"></div>
</div>

<script type="module">
window.cesiumViewer = new Cesium.Viewer('cesiumContainer', {
useDefaultRenderLoop: false,
animation: false,
baseLayerPicker: false,
fullscreenButton: false,
geocoder: false,
homeButton: false,
infoBox: false,
sceneModePicker: false,
selectionIndicator: false,
timeline: false,
navigationHelpButton: false,
imageryProvider: Cesium.createOpenStreetMapImageryProvider({
url: 'https://a.tile.openstreetmap.org/'
}),
terrainShadows: Cesium.ShadowMode.DISABLED
})

let cp = new Cesium.Cartesian3(
4303414.154026048,
552161.235598733,
4660771.704035539
)
cesiumViewer.camera.setView({
destination: cp,
orientation: {
heading: 10,
pitch: -Cesium.Math.PI_OVER_TWO * 0.5,
roll: 0.0
}
})

window.potreeViewer = new Potree.Viewer(
document.getElementById('potree_render_area'),
{
useDefaultRenderLoop: false
}
)

potreeViewer.setEDLEnabled(true)
potreeViewer.setFOV(60)
potreeViewer.setPointBudget(1_000_000)
potreeViewer.loadSettingsFromURL()
potreeViewer.setBackground(null)
potreeViewer.setDescription('Molloy Explorer')

potreeViewer.loadGUI(() => {
potreeViewer.setLanguage('en')
$('#menu_appearance').next().show()
$('#menu_tools').next().show()
$('#menu_scene').next().show()
$('#menu_filters').next().show()
potreeViewer.toggleSidebar()
})

let url = './pointclouds/data_converted/metadata.json'
Potree.loadPointCloud(url).then((e) => {
let pointcloud = e.pointcloud
let material = pointcloud.material

material.pointSizeType = Potree.PointSizeType.ADAPTIVE
material.shape = Potree.PointShape.CIRCLE
material.activeAttributeName = 'elevation'
material.gradient = Potree.Gradients['RAINBOW']

potreeViewer.scene.addPointCloud(pointcloud)

potreeViewer.scene.view.setView(
[401603.85, 8860821.54, 10000],
[401603.85, 8860821.54, -2650.47]
)

e.pointcloud.projection =
'+proj=utm +zone=32 +ellps=GRS80 +datum=ETRS89 +units=m +no_defs'
let pointcloudProjection = e.pointcloud.projection
let mapProjection = proj4.defs('WGS84')

window.toMap = proj4(pointcloudProjection, mapProjection)
window.toScene = proj4(mapProjection, pointcloudProjection)
})

function loop(timestamp) {
requestAnimationFrame(loop)

potreeViewer.update(potreeViewer.clock.getDelta(), timestamp)

potreeViewer.render()

if (window.toMap !== undefined) {
{
let camera = potreeViewer.scene.getActiveCamera()

let pPos = new THREE.Vector3(0, 0, 0).applyMatrix4(
camera.matrixWorld
)
let pRight = new THREE.Vector3(600, 0, 0).applyMatrix4(
camera.matrixWorld
)
let pUp = new THREE.Vector3(0, 600, 0).applyMatrix4(
camera.matrixWorld
)
let pTarget = potreeViewer.scene.view.getPivot()

let toCes = (pos) => {
let xy = [pos.x, pos.y]
let height = pos.z
let deg = toMap.forward(xy)
let cPos = Cesium.Cartesian3.fromDegrees(...deg, height)

return cPos
}

let cPos = toCes(pPos)
let cUpTarget = toCes(pUp)
let cTarget = toCes(pTarget)

let cDir = Cesium.Cartesian3.subtract(
cTarget,
cPos,
new Cesium.Cartesian3()
)
let cUp = Cesium.Cartesian3.subtract(
cUpTarget,
cPos,
new Cesium.Cartesian3()
)

cDir = Cesium.Cartesian3.normalize(cDir, new Cesium.Cartesian3())
cUp = Cesium.Cartesian3.normalize(cUp, new Cesium.Cartesian3())

cesiumViewer.camera.setView({
destination: cPos,
orientation: {
direction: cDir,
up: cUp
}
})

let aspect = potreeViewer.scene.getActiveCamera().aspect
if (aspect < 1) {
let fovy =
Math.PI * (potreeViewer.scene.getActiveCamera().fov / 180)
cesiumViewer.camera.frustum.fov = fovy
} else {
let fovy =
Math.PI * (potreeViewer.scene.getActiveCamera().fov / 180)
let fovx = Math.atan(Math.tan(0.5 * fovy) * aspect) * 2
cesiumViewer.camera.frustum.fov = fovx
}
}

cesiumViewer.render()
}
}

requestAnimationFrame(loop)
</script>
<!-- Main entry point -->
<script type="module" src="./src/main.js"></script>
</body>
</html>
58 changes: 58 additions & 0 deletions src/cameraSync.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,58 @@
export function syncCameras(potreeViewer, cesiumViewer) {
let camera = potreeViewer.scene.getActiveCamera()

let pPos = new THREE.Vector3(0, 0, 0).applyMatrix4(
camera.matrixWorld
)
let pUp = new THREE.Vector3(0, 600, 0).applyMatrix4(
camera.matrixWorld
)
let pTarget = potreeViewer.scene.view.getPivot()

let toCes = (pos) => {
let xy = [pos.x, pos.y]
let height = pos.z
let deg = toMap.forward(xy)
let cPos = Cesium.Cartesian3.fromDegrees(...deg, height)

return cPos
}

let cPos = toCes(pPos)
let cUpTarget = toCes(pUp)
let cTarget = toCes(pTarget)

let cDir = Cesium.Cartesian3.subtract(
cTarget,
cPos,
new Cesium.Cartesian3()
)
let cUp = Cesium.Cartesian3.subtract(
cUpTarget,
cPos,
new Cesium.Cartesian3()
)

cDir = Cesium.Cartesian3.normalize(cDir, new Cesium.Cartesian3())
cUp = Cesium.Cartesian3.normalize(cUp, new Cesium.Cartesian3())

cesiumViewer.camera.setView({
destination: cPos,
orientation: {
direction: cDir,
up: cUp
}
})

let aspect = potreeViewer.scene.getActiveCamera().aspect
if (aspect < 1) {
let fovy =
Math.PI * (potreeViewer.scene.getActiveCamera().fov / 180)
cesiumViewer.camera.frustum.fov = fovy
} else {
let fovy =
Math.PI * (potreeViewer.scene.getActiveCamera().fov / 180)
let fovx = Math.atan(Math.tan(0.5 * fovy) * aspect) * 2
cesiumViewer.camera.frustum.fov = fovx
}
}
32 changes: 32 additions & 0 deletions src/cesiumViewer.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
export function createCesiumViewer(containerId) {
const viewer = new Cesium.Viewer(containerId, {
useDefaultRenderLoop: false,
animation: false,
baseLayerPicker: false,
fullscreenButton: false,
geocoder: false,
homeButton: false,
infoBox: false,
sceneModePicker: false,
selectionIndicator: false,
timeline: false,
navigationHelpButton: false,
imageryProvider: Cesium.createOpenStreetMapImageryProvider({
url: 'https://a.tile.openstreetmap.org/'
}),
terrainShadows: Cesium.ShadowMode.DISABLED
})
return viewer;
}

export function setCesiumView(viewer, pos) {
const cp = new Cesium.Cartesian3(pos.x, pos.y, pos.z);
viewer.camera.setView({
destination: cp,
orientation: {
heading: pos.heading,
pitch: pos.pitch,
roll: pos.roll
}
});
}
16 changes: 16 additions & 0 deletions src/config.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
export const POTREE_POINTCLOUD_URL = "../pointclouds/data_converted/metadata.json";

export const INITIAL_CESIUM_POS = {
x: 4303414.154026048,
y: 552161.235598733,
z: 4660771.704035539,
heading: 10,
pitch: -Cesium.Math.PI_OVER_TWO * 0.5,
roll: 0.0
};

export const POTREE_SETTINGS = {
edl: true,
fov: 60,
pointBudget: 1_000_000
};
24 changes: 23 additions & 1 deletion src/main.js
Original file line number Diff line number Diff line change
@@ -1 +1,23 @@
/* Empty for now, add logic later */
import { POTREE_POINTCLOUD_URL, INITIAL_CESIUM_POS, POTREE_SETTINGS } from './config.js';
import { createCesiumViewer, setCesiumView } from './cesiumViewer.js';
import { createPotreeViewer } from './potreeViewer.js';
import { syncCameras } from './cameraSync.js';

async function init() {
window.cesiumViewer = createCesiumViewer('cesiumContainer');
setCesiumView(window.cesiumViewer, INITIAL_CESIUM_POS);

window.potreeViewer = await createPotreeViewer('potree_render_area', POTREE_POINTCLOUD_URL, POTREE_SETTINGS);

function loop(timestamp) {
requestAnimationFrame(loop);
potreeViewer.update(potreeViewer.clock.getDelta(), timestamp);
potreeViewer.render();
if(window.toMap) syncCameras(potreeViewer, cesiumViewer);
cesiumViewer.render();
}

requestAnimationFrame(loop);
}

init();
41 changes: 41 additions & 0 deletions src/potreeViewer.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
export async function createPotreeViewer(containerId, pointcloudUrl, settings) {
const viewer = new Potree.Viewer(document.getElementById(containerId), {
useDefaultRenderLoop: false
});

if(settings.edl) viewer.setEDLEnabled(true);
if(settings.fov) viewer.setFOV(settings.fov);
if(settings.pointBudget) viewer.setPointBudget(settings.pointBudget);

viewer.loadSettingsFromURL();
viewer.setBackground(null);
viewer.setDescription('Molloy Explorer')

viewer.loadGUI(() => {
viewer.setLanguage('en')
$('#menu_appearance').next().show()
$('#menu_tools').next().show()
$('#menu_scene').next().show()
$('#menu_filters').next().show()
viewer.toggleSidebar()
})

const e = await Potree.loadPointCloud(pointcloudUrl);
const pc = e.pointcloud;
viewer.scene.addPointCloud(pc);

pc.material.pointSizeType = Potree.PointSizeType.ADAPTIVE;
pc.material.shape = Potree.PointShape.CIRCLE
pc.material.activeAttributeName = "elevation";
pc.material.gradient = Potree.Gradients["RAINBOW"];

e.pointcloud.projection = "+proj=utm +zone=32 +ellps=GRS80 +datum=ETRS89 +units=m +no_defs";
const pointcloudProjection = e.pointcloud.projection;
const mapProjection = proj4.defs("WGS84");
window.toMap = proj4(pointcloudProjection, mapProjection);
window.toScene = proj4(mapProjection, pointcloudProjection);

viewer.scene.view.setView([401603.85, 8860821.54, 1000000], [401603.85, 8860821.54, -2650.47]);

return viewer;
}

0 comments on commit 305ec8b

Please sign in to comment.