UNPKG

react-planner

Version:

react-planner is a React Component for plans design. Draw a 2D floorplan and navigate it in 3D mode.

442 lines (341 loc) 13.7 kB
import * as Three from 'three'; import React from 'react'; const WIDTH = 10; const DEPTH = 20; const HEIGHT = 20; const grey = new Three.MeshLambertMaterial({color:0xaaaaaa}); const black = new Three.MeshLambertMaterial({color:0x000000}); const white = new Three.MeshLambertMaterial({color:0xffffff}); const glassMaterial = new Three.MeshLambertMaterial({color:0xffffff, transparent: true, opacity:0.5}); const objectMaxLOD = makeObjectMaxLOD(); const objectMinLOD = makeObjectMinLOD(); function makeObjectMaxLOD(){ let video_camera = new Three.Mesh(); let cylinderGeometry = new Three.CylinderGeometry(0.2,0.2,0.5,80); let body = new Three.Mesh(cylinderGeometry,grey); body.rotation.x+= Math.PI/2; body.position.set(0,0.5,0); let geometrySphereUp = new Three.SphereGeometry( 0.2, 32, 32 ); let sphereUp = new Three.Mesh( geometrySphereUp, grey ); sphereUp.position.set(0,-0.25,0); body.add(sphereUp); let cylinderGeometry2b = new Three.CylinderGeometry(0.085,0.085,0.5,80); let focus = new Three.Mesh(cylinderGeometry2b,black); focus.position.set(0,0.04,0); body.add(focus); let geometrySphereUp2 = new Three.SphereGeometry( 0.025, 32, 32 ); for (let i = 0; i < 16; i++) { let led_1 = new Three.Mesh( geometrySphereUp2, white ); let led_2 = new Three.Mesh( geometrySphereUp2, white ); led_1.position.set(Math.cos(2*Math.PI/14*i)*0.115,0.2497,Math.sin(2*Math.PI/14*i)*0.115 ); led_2.position.set(Math.cos(2*Math.PI/16*i)*0.17,0.25,Math.sin(2*Math.PI/16*i)*0.17); led_1.scale.set(1,1,1.3); led_2.scale.set(1,1,1.3); led_1.rotation.x+=Math.PI/2; led_2.rotation.x+=Math.PI/2; body.add(led_1); body.add(led_2); } let cylinderGeometry2 = new Three.CylinderGeometry(0.195,0.195,0.05,80); let glass = new Three.Mesh(cylinderGeometry2, glassMaterial); glass.position.set(0,0.27,0); body.add(glass); let cylinderGeometry3 = new Three.CylinderGeometry(0.2,0.2,0.1,80,16,true); let cover = new Three.Mesh(cylinderGeometry3,grey); cover.position.set(0,0.25,0); body.add(cover); let cubeGeometryBase = new Three.BoxGeometry(0.25,0.05,0.25); let base = new Three.Mesh(cubeGeometryBase,grey); base.position.set(0,-0.6,0.35); body.add(base); for (let i = 0.265; i <=0.5 ; i+=0.165) { let cylinderGeometry = new Three.CylinderGeometry(0.02,0.02,0.055,6,6); let locknut1 = new Three.Mesh(cylinderGeometry,black); let locknut2 = new Three.Mesh(cylinderGeometry,black); locknut1.position.set(0.08,-0.6,i); locknut2.position.set(-0.08,-0.6,i); body.add(locknut1); body.add(locknut2); } let shape2 = new Three.Shape(); shape2.moveTo( 0.2,0.45 ); shape2.lineTo( 0.5,0.5 ); shape2.lineTo( 0.7,0.5 ); shape2.lineTo(0.7,0.6); shape2.lineTo(0.2,0.6); let extrudeSettings = { steps: 2, depth: 0.1, bevelEnabled: false, bevelThickness: 1, bevelSize: 1, bevelSegments: 1 }; let geometry3 = new Three.ExtrudeGeometry( shape2, extrudeSettings ); let arm_p1 = new Three.Mesh(geometry3,grey) ; arm_p1.rotation.z=Math.PI/2; arm_p1.rotation.y=-Math.PI/2; arm_p1.position.set(0.05,-0.8,0.875); body.add( arm_p1 ); let cylinderGeometry4 = new Three.CylinderGeometry(0.1,0.1,0.1,80,16); let arm_p2 = new Three.Mesh(cylinderGeometry4,grey); arm_p2.rotation.x+=Math.PI/2; arm_p2.position.set(0,-0.02,0.325); body.add(arm_p2); let cylinderGeometry5 = new Three.CylinderGeometry(0.05,0.05,0.14,80,16); let arm_p3 = new Three.Mesh(cylinderGeometry5,black); arm_p3.rotation.x+=Math.PI/2; arm_p3.position.set(0,-0.02,0.325); body.add(arm_p3); let cylinderGeometry6 = new Three.CylinderGeometry(0.025,0.025,0.16,80,16); let arm_p3b = new Three.Mesh(cylinderGeometry6,grey); arm_p3b.rotation.x+=Math.PI/2; arm_p3b.position.set(0,-0.02,0.325); body.add(arm_p3b); let cylinderGeometry7 = new Three.CylinderGeometry(0.026,0.026,0.12,80,16); let arm_p4 = new Three.Mesh(cylinderGeometry7,black); arm_p4.rotation.z+=Math.PI/2; arm_p4.position.set(0,-0.02,0.23); body.add(arm_p4); let cylinderGeometry8 = new Three.CylinderGeometry(0.02,0.02,0.16,80,16); let arm_p5 = new Three.Mesh(cylinderGeometry8,grey); arm_p5.rotation.z+=Math.PI/2; arm_p5.position.set(0,-0.02,0.23); body.add(arm_p5); let joint = new Three.Shape(); // startpoint joint.moveTo(0, 0); joint.lineTo(0, 0.1); joint.lineTo(0.1, 0.1); joint.bezierCurveTo(0.05,0.05,0.05,0.05,0.1,0); let extrudeSettings2 = { depth: 0.1, bevelEnabled: false, bevelSegments: 1, steps: 1, bevelSize: 1, bevelThickness: 1 }; let geometry4 = new Three.ExtrudeGeometry( joint, extrudeSettings2 ); let mesh_1 = new Three.Mesh( geometry4, grey ); mesh_1.position.set(-0.05,0.03,0.15); mesh_1.rotation.y+=Math.PI/2; mesh_1.rotation.z+=-Math.PI; let mesh_2 = new Three.Mesh( geometry4, grey ); mesh_2.position.set(-0.05,-0.07,0.3); mesh_2.rotation.y+=Math.PI/2; body.add(mesh_1); body.add(mesh_2); let points = []; points.push( new Three.Vector2(0.2, 0)); points.push( new Three.Vector2(0.2, 0)); points.push( new Three.Vector2(0.2, 0.2)); points.push( new Three.Vector2(0.2, 0.2)); let geometry = new Three.LatheGeometry( points, 200, 0, Math.PI ); grey.side = Three.DoubleSide; let cover_2 = new Three.Mesh(geometry,grey); cover_2.position.set(0,0.2,0); cover_2.rotation.y+=Math.PI/2; body.add(cover_2); let cylinderGeometry9 = new Three.CylinderGeometry(0.025,0.02,0.3,80,16); let antenna_p1 = new Three.Mesh(cylinderGeometry9,black); antenna_p1.rotation.x+=Math.PI/2; antenna_p1.position.set(0,-0.5,-0.18); body.add(antenna_p1); let cylinderGeometry10 = new Three.CylinderGeometry(0.02,0.015,0.3,80,16); let antenna_p2 = new Three.Mesh(cylinderGeometry10,black); antenna_p2.rotation.x+=Math.PI/2; antenna_p2.position.set(0,-0.5,-0.35); body.add(antenna_p2); let sphere_p1 = new Three.SphereGeometry( 0.015, 32, 32 ); let antenna_p3 = new Three.Mesh( sphere_p1, black ); antenna_p3.position.set(0,-0.5,-0.5); body.add(antenna_p3); let sphere_p2 = new Three.SphereGeometry( 0.04, 32, 32 ); let antenna_p4 = new Three.Mesh( sphere_p2, black ); antenna_p4.position.set(0,-0.5,0); body.add(antenna_p4); let cylinderGeometry11 = new Three.CylinderGeometry(0.025,0.025,0.1,80,16); let antenna_p5 = new Three.Mesh(cylinderGeometry11,black); antenna_p5.position.set(0,-0.42,0); body.add(antenna_p5); video_camera.add(body); return video_camera; } function makeObjectMinLOD(){ let video_camera = new Three.Mesh(); let cylinderGeometry = new Three.CylinderGeometry(0.2,0.2,0.5,8.8); let body = new Three.Mesh(cylinderGeometry,grey); body.rotation.x+= Math.PI/2; body.position.set(0,0.5,0); let geometrySphereUp = new Three.SphereGeometry( 0.2, 8, 8 ); let sphereUp = new Three.Mesh( geometrySphereUp, grey ); sphereUp.position.set(0,-0.25,0); body.add(sphereUp); let cylinderGeometry2b = new Three.CylinderGeometry(0.085,0.085,0.5,8,8); let focus = new Three.Mesh(cylinderGeometry2b,black); focus.position.set(0,0.04,0); body.add(focus); let cylinderGeometry2 = new Three.CylinderGeometry(0.195,0.195,0.05,8,8); let glass = new Three.Mesh(cylinderGeometry2,glassMaterial); glass.position.set(0,0.27,0); body.add(glass); let cylinderGeometry3 = new Three.CylinderGeometry(0.2,0.2,0.1,8,8,true); let cover = new Three.Mesh(cylinderGeometry3,grey); cover.position.set(0,0.25,0); body.add(cover); let cubeGeometryBase = new Three.BoxGeometry(0.25,0.05,0.25); let base = new Three.Mesh(cubeGeometryBase,grey); base.position.set(0,-0.6,0.35); body.add(base); let shape2 = new Three.Shape(); shape2.moveTo( 0.2,0.45 ); shape2.lineTo( 0.5,0.5 ); shape2.lineTo( 0.7,0.5 ); shape2.lineTo(0.7,0.6); shape2.lineTo(0.2,0.6); let extrudeSettings = { steps: 2, depth: 0.1, bevelEnabled: false, bevelThickness: 1, bevelSize: 1, bevelSegments: 1 }; let geometry3 = new Three.ExtrudeGeometry( shape2, extrudeSettings ); let arm_p1 = new Three.Mesh(geometry3,grey) ; arm_p1.rotation.z=Math.PI/2; arm_p1.rotation.y=-Math.PI/2; arm_p1.position.set(0.05,-0.8,0.875); body.add( arm_p1 ); let cylinderGeometry4 = new Three.CylinderGeometry(0.1,0.1,0.1,80,16); let arm_p2 = new Three.Mesh(cylinderGeometry4,grey); arm_p2.rotation.x+=Math.PI/2; arm_p2.position.set(0,-0.02,0.325); body.add(arm_p2); let cylinderGeometry5 = new Three.CylinderGeometry(0.05,0.05,0.14,80,16); let arm_p3 = new Three.Mesh(cylinderGeometry5,black); arm_p3.rotation.x+=Math.PI/2; arm_p3.position.set(0,-0.02,0.325); body.add(arm_p3); let cylinderGeometry6 = new Three.CylinderGeometry(0.025,0.025,0.16,80,16); let arm_p3b = new Three.Mesh(cylinderGeometry6,grey); arm_p3b.rotation.x+=Math.PI/2; arm_p3b.position.set(0,-0.02,0.325); body.add(arm_p3b); let cylinderGeometry7 = new Three.CylinderGeometry(0.026,0.026,0.12,80,16); let arm_p4 = new Three.Mesh(cylinderGeometry7,black); arm_p4.rotation.z+=Math.PI/2; arm_p4.position.set(0,-0.02,0.23); body.add(arm_p4); let cylinderGeometry8 = new Three.CylinderGeometry(0.02,0.02,0.16,80,16); let arm_p5 = new Three.Mesh(cylinderGeometry8,grey); arm_p5.rotation.z+=Math.PI/2; arm_p5.position.set(0,-0.02,0.23); body.add(arm_p5); let joint = new Three.Shape(); // startpoint joint.moveTo(0, 0); joint.lineTo(0, 0.1); joint.lineTo(0.1, 0.1); joint.bezierCurveTo(0.05,0.05,0.05,0.05,0.1,0); let extrudeSettings2 = { depth: 0.1, bevelEnabled: false, bevelSegments: 1, steps: 1, bevelSize: 1, bevelThickness: 1 }; let geometry4 = new Three.ExtrudeGeometry( joint, extrudeSettings2 ); let mesh_1 = new Three.Mesh( geometry4, grey ); mesh_1.position.set(-0.05,0.03,0.15); mesh_1.rotation.y+=Math.PI/2; mesh_1.rotation.z+=-Math.PI; let mesh_2 = new Three.Mesh( geometry4, grey ); mesh_2.position.set(-0.05,-0.07,0.3); mesh_2.rotation.y+=Math.PI/2; body.add(mesh_1); body.add(mesh_2); let cylinderGeometry9 = new Three.CylinderGeometry(0.025,0.02,0.3,8,8); let antenna_p1 = new Three.Mesh(cylinderGeometry9,black); antenna_p1.rotation.x+=Math.PI/2; antenna_p1.position.set(0,-0.5,-0.18); body.add(antenna_p1); let cylinderGeometry10 = new Three.CylinderGeometry(0.02,0.015,0.3,8,8); let antenna_p2 = new Three.Mesh(cylinderGeometry10,black); antenna_p2.rotation.x+=Math.PI/2; antenna_p2.position.set(0,-0.5,-0.35); body.add(antenna_p2); let sphere_p1 = new Three.SphereGeometry( 0.015, 8, 8 ); let antenna_p3 = new Three.Mesh( sphere_p1, black ); antenna_p3.position.set(0,-0.5,-0.5); body.add(antenna_p3); let sphere_p2 = new Three.SphereGeometry( 0.04, 8, 8 ); let antenna_p4 = new Three.Mesh( sphere_p2, black ); antenna_p4.position.set(0,-0.5,0); body.add(antenna_p4); let cylinderGeometry11 = new Three.CylinderGeometry(0.025,0.025,0.1,8,8); let antenna_p5 = new Three.Mesh(cylinderGeometry11,black); antenna_p5.position.set(0,-0.42,0); body.add(antenna_p5); video_camera.add(body); return video_camera; } export default { name: 'camera', prototype: 'items', info: { tag: ['security', 'metal'], title: 'camera', description: 'camera', image: require('./camera.png') }, properties: { altitude: { label: 'altitude', type: 'length-measure', defaultValue: { length: 100, unit: 'cm' } } }, render2D: function (element, layer, scene) { let angle = element.rotation + 90; let textRotation = 0; if (Math.sin(angle * Math.PI / 180) < 0) { textRotation = 180; } return ( <g transform={`translate(${-WIDTH / 2},${-DEPTH/2})`}> <rect key='1' x='0' y='0' width={WIDTH} height={DEPTH} style={{stroke: element.selected ? '#0096fd' : '#000', strokeWidth: '2px', fill: '#84e1ce'}}/> <text key='2' x='0' y='0' transform={`translate(${WIDTH / 2}, ${DEPTH / 2}) scale(1,-1) rotate(${textRotation})`} style={{textAnchor: 'middle', fontSize: '11px'}}> {element.type} </text> </g> ) }, render3D: function (element, layer, scene) { let newAltitude = element.properties.get('altitude').get('length'); /**************** LOD max ***********************/ let video_cameraMaxLOD = new Three.Object3D(); video_cameraMaxLOD.add(objectMaxLOD.clone()); let aa = new Three.Box3().setFromObject(video_cameraMaxLOD); let deltaX = Math.abs(aa.max.x - aa.min.x); let deltaY = Math.abs(aa.max.y - aa.min.y); let deltaZ = Math.abs(aa.max.z - aa.min.z); video_cameraMaxLOD.position.y+= HEIGHT/8 +newAltitude; video_cameraMaxLOD.position.z+= DEPTH/2; video_cameraMaxLOD.scale.set( DEPTH / deltaZ, HEIGHT / deltaY,WIDTH / deltaX); /**************** LOD min ***********************/ let video_cameraMinLOD = new Three.Object3D(); video_cameraMinLOD.add(objectMinLOD.clone()); video_cameraMinLOD.position.y+= HEIGHT/8 +newAltitude; video_cameraMinLOD.position.z+= DEPTH/2; video_cameraMinLOD.scale.set( DEPTH / deltaZ, HEIGHT / deltaY,WIDTH / deltaX); /**** all level of detail ***/ let lod = new Three.LOD(); lod.addLevel(video_cameraMaxLOD, 200); lod.addLevel(video_cameraMinLOD, 900); lod.updateMatrix(); lod.matrixAutoUpdate = false; if (element.selected) { let bbox = new Three.BoxHelper(lod, 0x99c3fb); bbox.material.linewidth = 5; bbox.renderOrder = 1000; bbox.material.depthTest = false; lod.add(bbox); } return Promise.resolve(lod); } };