|  |  |  | 
|---|
|  |  |  | import React, { useEffect, useRef } from 'react'; | 
|---|
|  |  |  | import * as THREE from 'three'; | 
|---|
|  |  |  | import { ThreeElements, useLoader, extend } from '@react-three/fiber'; | 
|---|
|  |  |  | import { extend } from '@react-three/fiber'; | 
|---|
|  |  |  | import { Geometry, Base, Subtraction, Addition } from '@react-three/csg'; | 
|---|
|  |  |  | import { FontLoader } from 'three/examples/jsm/loaders/FontLoader'; | 
|---|
|  |  |  | import { TextGeometry } from 'three/examples/jsm/geometries/TextGeometry'; | 
|---|
|  |  |  | import { DEBUG } from '../config/setting'; | 
|---|
|  |  |  | extend({ TextGeometry }); | 
|---|
|  |  |  |  | 
|---|
|  |  |  | const House = (props) => { | 
|---|
|  |  |  | const { | 
|---|
|  |  |  | wallThickness = 2, | 
|---|
|  |  |  | width = 1400, | 
|---|
|  |  |  | length = 1200, | 
|---|
|  |  |  | height = 400, | 
|---|
|  |  |  | wallOpacity = .6, | 
|---|
|  |  |  | width = DEBUG ? 14000 : 1400, | 
|---|
|  |  |  | length = DEBUG ? 12000 : 1200, | 
|---|
|  |  |  | height = DEBUG ? 4000 : 400, | 
|---|
|  |  |  | aside_width = 130, | 
|---|
|  |  |  | aside_length = 130, | 
|---|
|  |  |  | position = new THREE.Vector3(200, 0, 0), | 
|---|
|  |  |  | 
|---|
|  |  |  |  | 
|---|
|  |  |  | // const texture = new THREE.TextureLoader().load('/static/wall_pic5.jpg'); | 
|---|
|  |  |  | const texture = new THREE.TextureLoader().load( | 
|---|
|  |  |  | process.env.NODE_ENV == 'development' | 
|---|
|  |  |  | ? '/static/wall_pic5.jpg' | 
|---|
|  |  |  | : `/degital-twin-3d/static/wall_pic5.jpg` | 
|---|
|  |  |  | `/textures/wall_pic5.jpg` | 
|---|
|  |  |  | ); | 
|---|
|  |  |  | console.log('env', process.env.NODE_ENV); | 
|---|
|  |  |  |  | 
|---|
|  |  |  | texture.wrapS = THREE.RepeatWrapping; // 水平方向重复 | 
|---|
|  |  |  | texture.repeat.set(0.02, 0.02); | 
|---|
|  |  |  |  | 
|---|
|  |  |  | const roofTexture = new THREE.TextureLoader().load( | 
|---|
|  |  |  | process.env.NODE_ENV == 'development' | 
|---|
|  |  |  | ? '/static/wall_pic7.png' | 
|---|
|  |  |  | : `/degital-twin-3d/static/wall_pic7.png` | 
|---|
|  |  |  | `/textures/wall_pic7.png` | 
|---|
|  |  |  | ); | 
|---|
|  |  |  | roofTexture.wrapS = THREE.RepeatWrapping; // 水平方向重复 | 
|---|
|  |  |  | roofTexture.wrapT = THREE.RepeatWrapping; // 垂直方向重复 | 
|---|
|  |  |  | 
|---|
|  |  |  | roofTexture.repeat.set(0.005, 0.005); | 
|---|
|  |  |  |  | 
|---|
|  |  |  | const floorTexture = new THREE.TextureLoader().load( | 
|---|
|  |  |  | process.env.NODE_ENV == 'development' | 
|---|
|  |  |  | ? '/static/floor_02.png' | 
|---|
|  |  |  | : `/degital-twin-3d/static/floor_02.png` | 
|---|
|  |  |  | `/textures/floor_02.png` | 
|---|
|  |  |  | ); | 
|---|
|  |  |  | floorTexture.wrapS = THREE.RepeatWrapping; // 水平方向重复 | 
|---|
|  |  |  | floorTexture.wrapT = THREE.RepeatWrapping; // 垂直方向重复 | 
|---|
|  |  |  | floorTexture.repeat.set(0.01, 0.01); | 
|---|
|  |  |  |  | 
|---|
|  |  |  | const roadTexture = new THREE.TextureLoader().load( | 
|---|
|  |  |  | process.env.NODE_ENV == 'development' | 
|---|
|  |  |  | ? '/static/road2.jpg' | 
|---|
|  |  |  | : `/degital-twin-3d/static/road2.jpg` | 
|---|
|  |  |  | `/textures/road2.jpg` | 
|---|
|  |  |  | ); | 
|---|
|  |  |  | roadTexture.wrapS = THREE.RepeatWrapping; // 水平方向重复 | 
|---|
|  |  |  | roadTexture.wrapT = THREE.RepeatWrapping; // 垂直方向重复 | 
|---|
|  |  |  | roadTexture.repeat.set(5, 1); | 
|---|
|  |  |  |  | 
|---|
|  |  |  | const grassTexture = new THREE.TextureLoader().load( | 
|---|
|  |  |  | process.env.NODE_ENV == 'development' | 
|---|
|  |  |  | ? '/static/grass.jpg' | 
|---|
|  |  |  | : `/degital-twin-3d/static/grass.jpg` | 
|---|
|  |  |  | `/textures/grass.jpg` | 
|---|
|  |  |  | ); | 
|---|
|  |  |  | grassTexture.wrapS = THREE.RepeatWrapping; // 水平方向重复 | 
|---|
|  |  |  | grassTexture.wrapT = THREE.RepeatWrapping; // 垂直方向重复 | 
|---|
|  |  |  | grassTexture.repeat.set(20, 1); | 
|---|
|  |  |  |  | 
|---|
|  |  |  | const surfaceTexture = new THREE.TextureLoader().load( | 
|---|
|  |  |  | process.env.NODE_ENV == 'development' | 
|---|
|  |  |  | ? '/static/surface.jpg' | 
|---|
|  |  |  | : `/degital-twin-3d/static/surface.jpg` | 
|---|
|  |  |  | `/textures/surface.jpg` | 
|---|
|  |  |  | ); | 
|---|
|  |  |  | surfaceTexture.wrapS = THREE.RepeatWrapping; // 水平方向重复 | 
|---|
|  |  |  | surfaceTexture.wrapT = THREE.RepeatWrapping; // 垂直方向重复 | 
|---|
|  |  |  | surfaceTexture.repeat.set(0.01, 0.01); | 
|---|
|  |  |  |  | 
|---|
|  |  |  | const crossTexture = new THREE.TextureLoader().load( | 
|---|
|  |  |  | process.env.NODE_ENV == 'development' | 
|---|
|  |  |  | ? '/static/cross.png' | 
|---|
|  |  |  | : `/degital-twin-3d/static/cross.png` | 
|---|
|  |  |  | `/textures/cross.png` | 
|---|
|  |  |  | ); | 
|---|
|  |  |  | crossTexture.wrapS = THREE.RepeatWrapping; // 水平方向重复 | 
|---|
|  |  |  | crossTexture.wrapT = THREE.RepeatWrapping; // 垂直方向重复 | 
|---|
|  |  |  | 
|---|
|  |  |  | { depth: wallThickness }, | 
|---|
|  |  |  | ]} | 
|---|
|  |  |  | /> | 
|---|
|  |  |  | <meshPhongMaterial map={texture} metalness={1.0} reflectivity={1.5}></meshPhongMaterial> | 
|---|
|  |  |  | <meshPhongMaterial map={texture} metalness={1.0} reflectivity={1.5} transparent={true} opacity={wallOpacity}></meshPhongMaterial> | 
|---|
|  |  |  | </mesh> | 
|---|
|  |  |  | {/* 后面的路 */} | 
|---|
|  |  |  | <mesh rotation={[Math.PI / 2, 0, 0]}> | 
|---|
|  |  |  | 
|---|
|  |  |  | { depth: wallThickness }, | 
|---|
|  |  |  | ]} | 
|---|
|  |  |  | /> | 
|---|
|  |  |  | <meshPhongMaterial map={texture} metalness={1.0} reflectivity={1.5}></meshPhongMaterial> | 
|---|
|  |  |  | <meshPhongMaterial map={texture} metalness={1.0} reflectivity={1.5} transparent={true} opacity={wallOpacity}></meshPhongMaterial> | 
|---|
|  |  |  | </mesh> | 
|---|
|  |  |  | {/* 前面的墙壁下面的路 */} | 
|---|
|  |  |  | <mesh rotation={[Math.PI / 2, 0, 0]}> | 
|---|
|  |  |  | 
|---|
|  |  |  | receiveShadow | 
|---|
|  |  |  | > | 
|---|
|  |  |  | <extrudeGeometry args={[getBackWallShape(), { depth: wallThickness }]} /> | 
|---|
|  |  |  | <meshPhysicalMaterial map={texture} metalness={1.0} roughness={0.8}></meshPhysicalMaterial> | 
|---|
|  |  |  | <meshPhysicalMaterial map={texture} metalness={1.0} roughness={0.8} | 
|---|
|  |  |  | transparent={true} | 
|---|
|  |  |  | opacity={wallOpacity} | 
|---|
|  |  |  | ></meshPhysicalMaterial> | 
|---|
|  |  |  | </mesh> | 
|---|
|  |  |  | <mesh rotation={[Math.PI / 2, 0, 0]}> | 
|---|
|  |  |  | <LeftRoad></LeftRoad> | 
|---|
|  |  |  | 
|---|
|  |  |  | color={'#0069c5'} | 
|---|
|  |  |  | metalness={1.0} | 
|---|
|  |  |  | roughness={0.8} | 
|---|
|  |  |  | transparent={true} | 
|---|
|  |  |  | opacity={wallOpacity} | 
|---|
|  |  |  | ></meshPhysicalMaterial> | 
|---|
|  |  |  | </mesh> | 
|---|
|  |  |  | {/* 顶部第二层 */} | 
|---|
|  |  |  | 
|---|
|  |  |  | color={'#4895f6'} | 
|---|
|  |  |  | metalness={1.0} | 
|---|
|  |  |  | roughness={0.8} | 
|---|
|  |  |  | transparent={true} | 
|---|
|  |  |  | opacity={wallOpacity} | 
|---|
|  |  |  | ></meshPhysicalMaterial> | 
|---|
|  |  |  | </mesh> | 
|---|
|  |  |  | {/* 顶部第三层 */} | 
|---|
|  |  |  | 
|---|
|  |  |  | map={roofTexture} | 
|---|
|  |  |  | metalness={1.0} | 
|---|
|  |  |  | roughness={0.8} | 
|---|
|  |  |  | transparent={true} | 
|---|
|  |  |  | opacity={wallOpacity} | 
|---|
|  |  |  | ></meshPhysicalMaterial> | 
|---|
|  |  |  | </mesh> | 
|---|
|  |  |  | </group> | 
|---|