|
@@ -31,6 +31,167 @@ export function start(dom, mapDom, number ){ //t-Zvd3w0m
|
|
|
|
|
|
let viewer = new Potree.Viewer(dom , mapDom);
|
|
let viewer = new Potree.Viewer(dom , mapDom);
|
|
|
|
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+ /* viewer.addEventListener('allLoaded',()=>{
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+ const baseGeometry = new THREE.BufferGeometry();
|
|
|
|
+ baseGeometry.setIndex([0, 1, 2, 0, 2, 3]);
|
|
|
|
+
|
|
|
|
+ const positionsArray = new Float32Array(4 * 3);
|
|
|
|
+ const positions = new THREE.BufferAttribute(positionsArray, 3);
|
|
|
|
+ baseGeometry.setAttribute('position', positions);
|
|
|
|
+ positions.setXYZ(0, -1.0, -1.0, 0.0);
|
|
|
|
+ positions.setXYZ(1, -1.0, 1.0, 0.0);
|
|
|
|
+ positions.setXYZ(2, 1.0, 1.0, 0.0);
|
|
|
|
+ positions.setXYZ(3, 1.0, -1.0, 0.0);
|
|
|
|
+ positions.needsUpdate = true;
|
|
|
|
+ const geometry = new THREE.InstancedBufferGeometry().copy(baseGeometry);
|
|
|
|
+ let maxSplatCount = 8
|
|
|
|
+ // Splat index buffer
|
|
|
|
+ const splatIndexArray = new Uint32Array(maxSplatCount);
|
|
|
|
+ const splatIndexes = new THREE.InstancedBufferAttribute(splatIndexArray, 1, false);
|
|
|
|
+ splatIndexes.setUsage(THREE.DynamicDrawUsage);
|
|
|
|
+ geometry.setAttribute('splatIndex', splatIndexes);
|
|
|
|
+
|
|
|
|
+ const splatPosArray = new Float32Array(maxSplatCount*3);
|
|
|
|
+ const splatPoses = new THREE.InstancedBufferAttribute(splatPosArray, 3, false);
|
|
|
|
+ splatPoses.setUsage(THREE.DynamicDrawUsage);
|
|
|
|
+ geometry.setAttribute('splatCenter', splatPoses);
|
|
|
|
+
|
|
|
|
+ splatPosArray.set([0,0,0,
|
|
|
|
+ 1,1,1,
|
|
|
|
+ 2,2,2,
|
|
|
|
+ 3,3,3,
|
|
|
|
+ 4,4,4,
|
|
|
|
+ 5,5,5,
|
|
|
|
+ 6,6,6,
|
|
|
|
+ 7,7,7])
|
|
|
|
+
|
|
|
|
+ let vertexShaderSource = `
|
|
|
|
+ precision highp float;
|
|
|
|
+ #include <common>
|
|
|
|
+ attribute vec3 splatCenter;
|
|
|
|
+
|
|
|
|
+ attribute float splatIndex;
|
|
|
|
+
|
|
|
|
+ varying vec2 vPosition;
|
|
|
|
+
|
|
|
|
+ const float sqrt8 = sqrt(8.0);
|
|
|
|
+ const float minAlpha = 1.0 / 255.0;
|
|
|
|
+
|
|
|
|
+ void main () {
|
|
|
|
+
|
|
|
|
+ mat4 transformModelViewMatrix = modelViewMatrix;
|
|
|
|
+ vec4 viewCenter = transformModelViewMatrix * vec4(splatCenter, 1.0);
|
|
|
|
+ vec4 clipCenter = projectionMatrix * viewCenter;
|
|
|
|
+
|
|
|
|
+ float clip = 1.2 * clipCenter.w;
|
|
|
|
+ if (clipCenter.z < -clip || clipCenter.x < -clip || clipCenter.x > clip || clipCenter.y < -clip || clipCenter.y > clip) {
|
|
|
|
+ gl_Position = vec4(0.0, 0.0, 2.0, 1.0);
|
|
|
|
+ return;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ vPosition = position.xy;
|
|
|
|
+
|
|
|
|
+ vec3 ndcCenter = clipCenter.xyz / clipCenter.w;
|
|
|
|
+
|
|
|
|
+ float eigenValue1 = 0.2;
|
|
|
|
+ float eigenValue2 = 0.2;
|
|
|
|
+
|
|
|
|
+ //vec2 eigenVector1 = normalize(vec2(b, eigenValue1 - a));
|
|
|
|
+ vec2 eigenVector1 = normalize(vec2(0.5, 0.5));
|
|
|
|
+ vec2 eigenVector2 = vec2(eigenVector1.y, -eigenVector1.x);
|
|
|
|
+
|
|
|
|
+ vec2 basisVector1 = eigenVector1 * min(sqrt8 * sqrt(eigenValue1), 2048.0);
|
|
|
|
+ vec2 basisVector2 = eigenVector2 * min(sqrt8 * sqrt(eigenValue2), 2048.0);
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+ vec2 ndcOffset = vec2(vPosition.x * basisVector1 + vPosition.y * basisVector2) / viewport * 2.0 ;
|
|
|
|
+
|
|
|
|
+ gl_Position = vec4(ndcCenter.xy + ndcOffset, ndcCenter.z , 1.0);
|
|
|
|
+
|
|
|
|
+ vPosition *= sqrt8;
|
|
|
|
+ }`;
|
|
|
|
+
|
|
|
|
+ //面片模拟椭球,总是有厚度
|
|
|
|
+ const fragmentShaderSource = `
|
|
|
|
+ precision highp float;
|
|
|
|
+ #include <common>
|
|
|
|
+
|
|
|
|
+ uniform vec3 color;
|
|
|
|
+ varying vec2 vPosition;
|
|
|
|
+
|
|
|
|
+ void main () {
|
|
|
|
+ float A = dot(vPosition, vPosition);
|
|
|
|
+
|
|
|
|
+ if (A > 8.0) discard; //position的范围半径为1。指一个rectangle面中的范围。椭圆外的完全透明
|
|
|
|
+
|
|
|
|
+ float opacity = exp(-0.5 * A) * vColor.a; //周围的透明度降低
|
|
|
|
+
|
|
|
|
+ gl_FragColor = vec4(color.rgb, opacity);
|
|
|
|
+ }`;
|
|
|
|
+
|
|
|
|
+ const uniforms = {
|
|
|
|
+ 'viewport': {
|
|
|
|
+ 'type': 'v2',
|
|
|
|
+ 'value': new THREE.Vector2()
|
|
|
|
+ } ,
|
|
|
|
+ color:{
|
|
|
|
+ 'type': 'v3',
|
|
|
|
+ 'value': new THREE.Color()
|
|
|
|
+ }
|
|
|
|
+ };
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+ const material = new THREE.ShaderMaterial({
|
|
|
|
+ uniforms: uniforms,
|
|
|
|
+ vertexShader: vertexShaderSource,
|
|
|
|
+ fragmentShader: fragmentShaderSource,
|
|
|
|
+ transparent: true,
|
|
|
|
+ alphaTest: 1.0,
|
|
|
|
+ blending: THREE.NormalBlending,
|
|
|
|
+ depthTest: true,
|
|
|
|
+ depthWrite: false,
|
|
|
|
+ side: THREE.DoubleSide
|
|
|
|
+ });
|
|
|
|
+
|
|
|
|
+ window.splatMesh = new THREE.Mesh(geometry, material)
|
|
|
|
+
|
|
|
|
+ viewer.scene.scene.add(window.splatMesh)
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+ viewer.addEventListener('resize',(e)=>{
|
|
|
|
+ if(e.viewport.name == 'mainViewport'){
|
|
|
|
+ uniforms.viewport.copy(e.viewport.resolution)
|
|
|
|
+ }
|
|
|
|
+ })
|
|
|
|
+
|
|
|
|
+ window.setSplatIndexes = (globalIndexes)=>{
|
|
|
|
+ geometry.attributes.splatIndex.set(globalIndexes);
|
|
|
|
+ geometry.attributes.splatIndex.needsUpdate = true;
|
|
|
|
+ geometry.instanceCount = globalIndexes.length
|
|
|
|
+ }
|
|
|
|
+ })
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+ */
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+
|
|
let Alignment = viewer.modules.Alignment
|
|
let Alignment = viewer.modules.Alignment
|
|
|
|
|
|
viewer.setEDLEnabled(false);
|
|
viewer.setEDLEnabled(false);
|