examples/website/point-cloud/app.js (85 lines of code) (raw):
/* eslint-disable no-unused-vars */
import React, {useState, useEffect} from 'react';
import {render} from 'react-dom';
import DeckGL from '@deck.gl/react';
import {COORDINATE_SYSTEM, OrbitView, LinearInterpolator} from '@deck.gl/core';
import {PointCloudLayer} from '@deck.gl/layers';
import {LASWorkerLoader} from '@loaders.gl/las';
// import {PLYWorkerLoader} from '@loaders.gl/ply';
import {registerLoaders} from '@loaders.gl/core';
// Additional format support can be added here, see
// https://github.com/visgl/loaders.gl/blob/master/docs/api-reference/core/register-loaders.md
registerLoaders(LASWorkerLoader);
// registerLoaders(PLYWorkerLoader);
// Data source: kaarta.com
const LAZ_SAMPLE =
'https://raw.githubusercontent.com/visgl/deck.gl-data/master/examples/point-cloud-laz/indoor.0.1.laz';
// Data source: The Stanford 3D Scanning Repository
// const PLY_SAMPLE =
// 'https://raw.githubusercontent.com/visgl/deck.gl-data/master/examples/point-cloud-ply/lucy800k.ply';
const INITIAL_VIEW_STATE = {
target: [0, 0, 0],
rotationX: 0,
rotationOrbit: 0,
orbitAxis: 'Y',
fov: 50,
minZoom: 0,
maxZoom: 10,
zoom: 1
};
const transitionInterpolator = new LinearInterpolator(['rotationOrbit']);
export default function App({onLoad}) {
const [viewState, updateViewState] = useState(INITIAL_VIEW_STATE);
const [isLoaded, setIsLoaded] = useState(false);
useEffect(
() => {
if (!isLoaded) {
return;
}
const rotateCamera = () => {
updateViewState(v => ({
...v,
rotationOrbit: v.rotationOrbit + 120,
transitionDuration: 2400,
transitionInterpolator,
onTransitionEnd: rotateCamera
}));
};
rotateCamera();
},
[isLoaded]
);
const onDataLoad = ({header}) => {
if (header.boundingBox) {
const [mins, maxs] = header.boundingBox;
// File contains bounding box info
updateViewState({
...INITIAL_VIEW_STATE,
target: [(mins[0] + maxs[0]) / 2, (mins[1] + maxs[1]) / 2, (mins[2] + maxs[2]) / 2],
/* global window */
zoom: Math.log2(window.innerWidth / (maxs[0] - mins[0])) - 1
});
setIsLoaded(true);
}
if (onLoad) {
onLoad({count: header.vertexCount, progress: 1});
}
};
const layers = [
new PointCloudLayer({
id: 'laz-point-cloud-layer',
data: LAZ_SAMPLE,
onDataLoad,
coordinateSystem: COORDINATE_SYSTEM.CARTESIAN,
getNormal: [0, 1, 0],
getColor: [255, 255, 255],
opacity: 0.5,
pointSize: 0.5
})
];
return (
<DeckGL
views={new OrbitView()}
viewState={viewState}
controller={true}
onViewStateChange={v => updateViewState(v.viewState)}
layers={layers}
parameters={{
clearColor: [0.93, 0.86, 0.81, 1]
}}
/>
);
}
export function renderToDOM(container) {
render(<App />, container);
}