|
@@ -1,28 +1,39 @@
|
|
|
-<style type="text/css">
|
|
|
- * {
|
|
|
- margin: 0;
|
|
|
- padding: 0;
|
|
|
- }
|
|
|
-
|
|
|
- body {
|
|
|
- margin: 0;
|
|
|
- border: 0;
|
|
|
- padding: 0;
|
|
|
- width: 100%;
|
|
|
- height: 100%;
|
|
|
- overflow: hidden;
|
|
|
- }
|
|
|
-
|
|
|
- #ThreeJS {
|
|
|
- width: 100%;
|
|
|
- height: 100%;
|
|
|
- background: url("./images/bg.png") no-repeat;
|
|
|
- background-size: 100% 100%;
|
|
|
- }
|
|
|
-</style>
|
|
|
|
|
|
+<div class="box62 box" data-name="test61">
|
|
|
+ <div class="toolBox">
|
|
|
+ <span class="fit"></span>
|
|
|
+ <span class="close"></span>
|
|
|
+ </div>
|
|
|
+ <div class="test-box">
|
|
|
+ <div class="concent">
|
|
|
<div id="ThreeJS"></div>
|
|
|
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ <div class="panel-footer"></div>
|
|
|
+</div>
|
|
|
+
|
|
|
+<!-- 工具弹框 -->
|
|
|
+<div class="tools" style="display: none">
|
|
|
+ <div class="containerTool test61Toll">
|
|
|
+ <ul>
|
|
|
+ <li>
|
|
|
+ <span>宽度:</span>
|
|
|
+ <input class="setWidth" type="text" />
|
|
|
+ <span id="validateAge" class="regValidate"></span>
|
|
|
+ </li>
|
|
|
+ <li>
|
|
|
+ <span>高度:</span>
|
|
|
+ <input class="setHeight" type="text" />
|
|
|
+ </li>
|
|
|
+ </ul>
|
|
|
+ <!-- 确定 -->
|
|
|
+ <button class="fixBtn toolBtn">确定</button>
|
|
|
+ <button class="offBtn toolBtn">取消</button>
|
|
|
+ </div>
|
|
|
+</div>
|
|
|
+
|
|
|
+
|
|
|
<script src="js/three.js"></script>
|
|
|
<script src="js/ThreeBSP.js"></script>
|
|
|
<script src="js/GLTFLoader.js"></script>
|
|
@@ -35,45 +46,456 @@
|
|
|
|
|
|
|
|
|
<script type="module">
|
|
|
- const boxcontanier = document.getElementById("ThreeJS"); let scene, camera, renderer, controls, stats; const SCREEN_WIDTH = window.innerWidth; const SCREEN_HEIGHT = window.innerHeight; //加载贴图模型 let textureLoader = new THREE.TextureLoader(); var mixer
|
|
|
- = null; var clock = new THREE.Clock(); init(); animate(); function init() { // 场景 scene = new THREE.Scene(); // 相机 var VIEW_ANGLE = 60, ASPECT = SCREEN_WIDTH / SCREEN_HEIGHT, NEAR = 0.1, FAR = 2000; camera = new THREE.PerspectiveCamera(VIEW_ANGLE,
|
|
|
- ASPECT, NEAR, FAR); scene.add(camera); camera.position.set(0, 200, 400); camera.lookAt(scene.position); // 渲染器 if (Detector.webgl) renderer = new THREE.WebGLRenderer({ antialias: true, //开启锯齿 alpha: true, precision: 'highp', }); else renderer = new
|
|
|
- THREE.CanvasRenderer(); renderer.setSize(SCREEN_WIDTH, SCREEN_HEIGHT); renderer.setClearAlpha(0.0); renderer.shadowMap.enabled = true; //当界面改变时重新渲染canvas尺寸 window.οnresize = function () { renderer.setPixelRatio(window.devicePixelRatio); //设备像素比,防止画布输出模糊
|
|
|
- camera.aspect = window.innerWidth / window.innerHeight; camera.updateProjectionMatrix(); renderer.setSize(SCREEN_WIDTH, SCREEN_HEIGHT); }; //renderer.setClearColor(0xb9d3ff, 1); //设置背景颜色 boxcontanier.appendChild(renderer.domElement); // 鼠标控件 controls
|
|
|
- = new THREE.OrbitControls(camera, renderer.domElement); controls.addEventListener('change', render); controls.maxPolarAngle = Math.PI / 2; // 性能插件 stats = new Stats(); stats.domElement.style.position = 'absolute'; stats.domElement.style.top = '0px';
|
|
|
- stats.domElement.style.zIndex = 100; boxcontanier.appendChild(stats.domElement); //辅助线 // var axes = new THREE.AxesHelper(2000); // scene.add(axes); // 光源 var directionalLight = new THREE.PointLight(0xffffff, 1); // 光的颜色,光照强度 directionalLight.position.set(400,
|
|
|
- 300, 300); directionalLight.castShadow = true; scene.add(directionalLight); var directionalLight2 = new THREE.PointLight(0xffffff, 1); directionalLight2.position.set(-400, -300, -300); scene.add(directionalLight2); // var light=new THREE.PointLight(0x555555,1);
|
|
|
- // light.shadow.camera.near = 1; // light.shadow.camera.far = 5000; // light.position.set(-400,400,50); // light.castShadow = true; // scene.add(light) // var point = new THREE.PointLight(0xffffff,0.4); // point.position.set(0, 200, 0); //点光源位置 //
|
|
|
- scene.add(point); //点光源添加到场景中 var ambient = new THREE.AmbientLight(0xffffff, 0.6); ambient.position.set(0, 0, 0); scene.add(ambient); // 初始化模型 initModel(); } function initModel() { // 地板 createFloor(400, 160); // createWall(500, 6, 250,0,103,0,0,0,0,[{
|
|
|
- // size: [496, 6, 246], // position: [0, 0, 0], // rotation: [0, 0, 0] // }]) // 玻璃墙 createGlassWall(400, 100, 160, 0, 50, 0, 0, 0, 0, [{ size: [396, 100, 156], position: [0, 0, 0], rotation: [0, 0, 0] }, { size: [66, 70, 6], position: [-160, -15,
|
|
|
- 77], rotation: [0, 0, 0] }, { size: [66, 70, 6], position: [160, -15, 77], rotation: [0, 0, 0] }], 0.4); // 推拉门 createDoor(-160, 35, 80); createDoor(160, 35, 78); // 创建机柜 createCabinet(30, 80, 30, 96, 40, -58, 0, 0, 0) createCabinet(30, 80, 30, 64,
|
|
|
- 40, -58, 0, 0, 0) createCabinet(30, 80, 30, 32, 40, -58, 0, 0, 0) createCabinet(30, 80, 30, 0, 40, -58, 0, 0, 0) createCabinet(30, 80, 30, -32, 40, -58, 0, 0, 0) createCabinet(30, 80, 30, -64, 40, -58, 0, 0, 0) createCabinet(30, 80, 30, -96, 40, -58,
|
|
|
- 0, 0, 0) createCabinet(30, 80, 30, -128, 40, -58, 0, 0, 0) createCabinet(30, 80, 30, -160, 40, -58, 0, 0, 0) // createCabinet(30, 80, 30, -192, 40, -58, 0, 0, 0) // createCabinet(30, 80, 30, 32, 40, 102, 0, Math.PI, 0); createCabinet(30, 80, 30, 0,
|
|
|
- 40, 58, 0, Math.PI, 0); createCabinet(30, 80, 30, -32, 40, 58, 0, Math.PI, 0); createCabinet(30, 80, 30, -64, 40, 58, 0, Math.PI, 0); createCabinet(30, 80, 30, -96, 40, 58, 0, Math.PI, 0); // 桌子 createComputerDesk(82, 0, 57, 0, Math.PI / 2, 0) //
|
|
|
- 椅子 createChair(90, 17, 32, 0, Math.PI, 0); // 电脑 createComputer(90, 65, 57, 0, Math.PI, 0); //精灵字体 // createMark() } // 创建地板 function createFloor(width, height) { var floorGeometry = new THREE.PlaneGeometry(width, height); var maps = textureLoader.load('./images/floor.png');
|
|
|
- maps.wrapS = maps.wrapT = THREE.RepeatWrapping; maps.repeat.set(8, 6); maps.needsUpdate = true var material = new THREE.MeshBasicMaterial({ map: maps, side: THREE.DoubleSide }); var floor = new THREE.Mesh(floorGeometry, material); floor.rotation.x
|
|
|
- = Math.PI / 2; scene.add(floor); return floor; } // 创建墙 function createWall(w, h, d, px, py, pz, rx, ry, rz, holes) { var geometry = new THREE.BoxGeometry(w, h, d); var meterials = new THREE.MeshStandardMaterial({ color: 0xA5A5A5, side: THREE.DoubleSide
|
|
|
- }); var wall = new THREE.Mesh(geometry, meterials); if (holes) { for (var i = 0; i
|
|
|
- < holes.length; i++) { var totalBSP=n ew ThreeBSP(wall); var hole=h oles[i]; var holeGeometry=n ew THREE.BoxGeometry(hole.size[0], hole.size[1], hole.size[2]);
|
|
|
- var holeCube=n ew THREE.Mesh(holeGeometry); holeCube.position.x=h ole.position[0]; holeCube.position.y=h ole.position[1]; holeCube.position.z=h ole.position[2]; holeCube.rotation.x=h ole.rotation[0]; holeCube.rotation.y=h ole.rotation[1]; holeCube.rotation.z=h
|
|
|
- ole.rotation[2]; var clipBSP=n ew ThreeBSP(holeCube); var resultBSP=t otalBSP.subtract(clipBSP); wall=r esultBSP.toMesh(); } wall.material=m eterials; } wall.position.x=p x; wall.position.y=p y; wall.position.z=p z; wall.rotation.x=r x; wall.rotation.y=r
|
|
|
- y; wall.rotation.z=r z; scene.add(wall); return wall; } function createGlassWall(w, h, d, px, py, pz, rx, ry, rz, holes, opa) { var geometry=n ew THREE.BoxGeometry(w, h, d); var texture=n ew textureLoader.load( './images/jsk.png'); texture.wrapS=t
|
|
|
- exture.wrapT=T HREE.RepeatWrapping; texture.repeat.set(1, 1); var meterials=n ew THREE.MeshStandardMaterial({ // color: 0xD6F2F2, color: 0xEFF8FC, // map: texture, opacity: opa, transparent: true, side: THREE.DoubleSide }); var glassW=n ew THREE.Mesh(geometry,
|
|
|
- meterials); if (holes) { for (var i=0 ; i < holes.length; i++) { var totalBSP=n ew ThreeBSP(glassW); var hole=h oles[i]; var holeGeometry=n ew THREE.BoxGeometry(hole.size[0], hole.size[1], hole.size[2]); var holeCube=n ew THREE.Mesh(holeGeometry);
|
|
|
- holeCube.position.x=h ole.position[0]; holeCube.position.y=h ole.position[1]; holeCube.position.z=h ole.position[2]; holeCube.rotation.y=h ole.rotation[1]; var clipBSP=n ew ThreeBSP(holeCube); var resultBSP=t otalBSP.subtract(clipBSP); glassW=r esultBSP.toMesh();
|
|
|
- } glassW.material=m eterials; } glassW.position.x=p x; glassW.position.y=p y; glassW.position.z=p z; glassW.rotation.y=r y; scene.add(glassW); return glassW; } //加载门Fbx格式 function createDoor(px, py, pz) { const fbxloader=n ew THREE.FBXLoader(); fbxloader.load(
|
|
|
- "./model/door.fbx", function (obj) { const item=o bj.children[0]; item.scale.set(0.03, 0.05, 0.03); item.position.set(px, py, pz); obj.castShadow=t rue; //尝试制作动画部分 // const children1=i tem.children[0]; // const children4=i tem.children[3]; // children1.rotation.z=M
|
|
|
- ath.PI/2; // children1.position.set(-1100,500,0); // children4.rotation.z=M ath.PI/2; // children4.position.set(-1100,500,0); // mixer=n ew THREE.AnimationMixer(item); // var AnimationAction=mixer.clipAction(obj.animations[0]); // AnimationAction.timeScale=2
|
|
|
- ; // AnimationAction.clampWhenFinished=true; // AnimationAction.play(); scene.add(obj) }); } //创建机柜 function createCabinet(w, h, d, px, py, pz, rx, ry, rz) { var texture=n ew THREE.ImageUtils.loadTexture( './images/rack_door_front.png'); texture.wrapS=t
|
|
|
- exture.wrapT=T HREE.RepeatWrapping; texture.repeat.set(1, 1); var texture2=n ew THREE.ImageUtils.loadTexture( './images/rack_door_back.png'); texture2.wrapS=t exture2.wrapT=T HREE.RepeatWrapping; texture2.repeat.set(1, 1); var geometry=n ew THREE.BoxGeometry(w,
|
|
|
- h, d); //var material=n ew THREE.MeshBasicMaterial( { map: texture } ); // Create an array of materials to be used in a cube, one for each side var materialArray=[ ]; // order to add materials: x+,x-,y+,y-,z+,z- materialArray.push(new THREE.MeshBasicMaterial({
|
|
|
- map: texture2 })); materialArray.push(new THREE.MeshBasicMaterial({ map: texture2 })); materialArray.push(new THREE.MeshBasicMaterial({ map: texture2 })); materialArray.push(new THREE.MeshBasicMaterial({ map: texture2 })); materialArray.push(new THREE.MeshBasicMaterial({
|
|
|
- map: texture })); materialArray.push(new THREE.MeshBasicMaterial({ map: texture2 })); var material=n ew THREE.MeshFaceMaterial(materialArray); var cabinet=n ew THREE.Mesh(geometry, material); cabinet.position.x=p x; cabinet.position.y=p y; cabinet.position.z=p
|
|
|
- z; cabinet.rotation.y=r y; scene.add(cabinet); return cabinet; } // 创建桌子 function createComputerDesk(px, py, pz, rx, ry, rz) { // 加载 glTF 格式的模型 let loader=n ew THREE.GLTFLoader(); /*实例化加载器*/ var textureNormal=t extureLoader.load(
|
|
|
- './images/ambient_occlusion.jpg'); loader.load( './model/dnz.gltf', function (obj) { console.log(obj); obj.scene.scale.set(5, 10, 5); obj.scene.position.x=p x; obj.scene.position.y=p y; obj.scene.position.z=p z; obj.scene.rotation.y=r y; obj.scene.traverse(function (gltf) { if
|
|
|
- (gltf.type==='Mesh' ) { gltf.material=n ew THREE.MeshPhongMaterial({ color: 0xcccccc, map: textureNormal, normalScale: new THREE.Vector2(1, 1), }) } }) scene.add(obj.scene); }) } // 创建椅子 function createChair(px, py, pz, rx, ry, rz) { // 加载 glTF 格式的模型
|
|
|
- let loader=n ew THREE.GLTFLoader(); /*实例化加载器*/ loader.load( './fourImages/chair.gltf', function (obj) { //console.log(obj.scene.children); obj.scene.scale.set(0.5, 0.5, 0.5); obj.scene.position.x=p x; obj.scene.position.y=p y; obj.scene.position.z=p
|
|
|
- z; obj.scene.rotation.y=r y; scene.add(obj.scene); }) } // 创建电脑 function createComputer(px, py, pz, rx, ry, rz) { // 加载 glTF 格式的模型 let loader=n ew THREE.GLTFLoader(); /*实例化加载器*/ loader.load( './fourImages/computer.gltf', function (obj) { obj.scene.scale.set(0.5,
|
|
|
- 0.5, 0.5); obj.scene.position.x=p x; obj.scene.position.y=p y; obj.scene.position.z=p z; obj.scene.rotation.y=r y; scene.add(obj.scene); }) } //创建精灵字体 function createMark() { var texture=n ew THREE.TextureLoader().load( "./images/dakuang.png"); var
|
|
|
- spriteMaterial=n ew THREE.SpriteMaterial({ color: 0xff00ff,//设置精灵矩形区域颜色 rotation: Math.PI / 4,//旋转精灵对象45度,弧度值 map: texture,//设置精灵纹理贴图 }); var sprite=n ew THREE.Sprite(spriteMaterial); sprite.scale.set(10, 10, 1); scene.add(sprite); return sprite;
|
|
|
- } function animate() { requestAnimationFrame(animate); render(); update(); } // 更新插件 function update() { controls.update(); stats.update(); } function render() { renderer.render(scene, camera); } </script>
|
|
|
+ const boxcontanier = document.getElementById("ThreeJS");
|
|
|
+
|
|
|
+ let scene, camera, renderer, controls, stats;
|
|
|
+ const SCREEN_WIDTH = window.innerWidth;
|
|
|
+ const SCREEN_HEIGHT = window.innerHeight;
|
|
|
+
|
|
|
+ //加载贴图模型
|
|
|
+ let textureLoader = new THREE.TextureLoader();
|
|
|
+ var mixer=null;
|
|
|
+ var clock = new THREE.Clock();
|
|
|
+
|
|
|
+ init();
|
|
|
+ animate();
|
|
|
+
|
|
|
+ function init() {
|
|
|
+ // 场景
|
|
|
+ scene = new THREE.Scene();
|
|
|
+
|
|
|
+ // 相机
|
|
|
+ var VIEW_ANGLE = 60,
|
|
|
+ ASPECT = SCREEN_WIDTH / SCREEN_HEIGHT,
|
|
|
+ NEAR = 0.1,
|
|
|
+ FAR = 2000;
|
|
|
+
|
|
|
+ camera = new THREE.PerspectiveCamera(VIEW_ANGLE, ASPECT, NEAR, FAR);
|
|
|
+ scene.add(camera);
|
|
|
+ camera.position.set(0, 200, 400);
|
|
|
+ camera.lookAt(scene.position);
|
|
|
+
|
|
|
+ // 渲染器
|
|
|
+ if (Detector.webgl)
|
|
|
+ renderer = new THREE.WebGLRenderer({
|
|
|
+ antialias: true, //开启锯齿
|
|
|
+ alpha: true,
|
|
|
+ precision: 'highp',
|
|
|
+ });
|
|
|
+ else
|
|
|
+ renderer = new THREE.CanvasRenderer();
|
|
|
+
|
|
|
+
|
|
|
+ renderer.setSize(SCREEN_WIDTH, SCREEN_HEIGHT);
|
|
|
+ renderer.setClearAlpha(0.0);
|
|
|
+ renderer.shadowMap.enabled = true;
|
|
|
+ //当界面改变时重新渲染canvas尺寸
|
|
|
+ window.οnresize = function() {
|
|
|
+ renderer.setPixelRatio(window.devicePixelRatio); //设备像素比,防止画布输出模糊
|
|
|
+ camera.aspect = window.innerWidth / window.innerHeight;
|
|
|
+ camera.updateProjectionMatrix();
|
|
|
+ renderer.setSize(SCREEN_WIDTH, SCREEN_HEIGHT);
|
|
|
+ };
|
|
|
+ //renderer.setClearColor(0xb9d3ff, 1); //设置背景颜色
|
|
|
+ boxcontanier.appendChild(renderer.domElement);
|
|
|
+
|
|
|
+ // 鼠标控件
|
|
|
+ controls = new THREE.OrbitControls(camera, renderer.domElement);
|
|
|
+ controls.addEventListener('change', render);
|
|
|
+ controls.maxPolarAngle = Math.PI / 2;
|
|
|
+
|
|
|
+ // 性能插件
|
|
|
+ stats = new Stats();
|
|
|
+ stats.domElement.style.position = 'absolute';
|
|
|
+ stats.domElement.style.top = '0px';
|
|
|
+ stats.domElement.style.zIndex = 100;
|
|
|
+ boxcontanier.appendChild(stats.domElement);
|
|
|
+
|
|
|
+ //辅助线
|
|
|
+ // var axes = new THREE.AxesHelper(2000);
|
|
|
+ // scene.add(axes);
|
|
|
+
|
|
|
+ // 光源
|
|
|
+
|
|
|
+
|
|
|
+ var directionalLight = new THREE.PointLight(0xffffff, 1); // 光的颜色,光照强度
|
|
|
+ directionalLight.position.set(400, 300, 300);
|
|
|
+ directionalLight.castShadow = true;
|
|
|
+ scene.add(directionalLight);
|
|
|
+
|
|
|
+ var directionalLight2 = new THREE.PointLight(0xffffff, 1);
|
|
|
+ directionalLight2.position.set(-400, -300, -300);
|
|
|
+ scene.add(directionalLight2);
|
|
|
+
|
|
|
+ // var light=new THREE.PointLight(0x555555,1);
|
|
|
+ // light.shadow.camera.near = 1;
|
|
|
+ // light.shadow.camera.far = 5000;
|
|
|
+ // light.position.set(-400,400,50);
|
|
|
+ // light.castShadow = true;
|
|
|
+ // scene.add(light)
|
|
|
+
|
|
|
+ // var point = new THREE.PointLight(0xffffff,0.4);
|
|
|
+ // point.position.set(0, 200, 0); //点光源位置
|
|
|
+ // scene.add(point); //点光源添加到场景中
|
|
|
+
|
|
|
+
|
|
|
+ var ambient = new THREE.AmbientLight(0xffffff,0.6);
|
|
|
+ ambient.position.set(0,0,0);
|
|
|
+ scene.add(ambient);
|
|
|
+
|
|
|
+
|
|
|
+ // 初始化模型
|
|
|
+ initModel();
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ function initModel() {
|
|
|
+ // 地板
|
|
|
+ createFloor(400, 160);
|
|
|
+
|
|
|
+ // createWall(500, 6, 250,0,103,0,0,0,0,[{
|
|
|
+ // size: [496, 6, 246],
|
|
|
+ // position: [0, 0, 0],
|
|
|
+ // rotation: [0, 0, 0]
|
|
|
+ // }])
|
|
|
+
|
|
|
+ // 玻璃墙
|
|
|
+ createGlassWall(400, 100, 160, 0, 50, 0, 0, 0, 0,[{
|
|
|
+ size: [396, 100, 156],
|
|
|
+ position: [0, 0, 0],
|
|
|
+ rotation: [0, 0, 0]
|
|
|
+ },{
|
|
|
+ size: [66, 70, 6],
|
|
|
+ position: [-160, -15, 77],
|
|
|
+ rotation: [0, 0, 0]
|
|
|
+ },{
|
|
|
+ size: [66, 70, 6],
|
|
|
+ position: [160, -15, 77],
|
|
|
+ rotation: [0, 0, 0]
|
|
|
+ }],0.4);
|
|
|
+
|
|
|
+ // 推拉门
|
|
|
+ createDoor(-160, 35, 80);
|
|
|
+ createDoor(160, 35, 78);
|
|
|
+
|
|
|
+
|
|
|
+ // 创建机柜
|
|
|
+ createCabinet(30, 80, 30, 96, 40, -58, 0, 0, 0)
|
|
|
+ createCabinet(30, 80, 30, 64, 40, -58, 0, 0, 0)
|
|
|
+ createCabinet(30, 80, 30, 32, 40, -58, 0, 0, 0)
|
|
|
+ createCabinet(30, 80, 30, 0, 40, -58, 0, 0, 0)
|
|
|
+ createCabinet(30, 80, 30, -32, 40, -58, 0, 0, 0)
|
|
|
+ createCabinet(30, 80, 30, -64, 40, -58, 0, 0, 0)
|
|
|
+ createCabinet(30, 80, 30, -96, 40, -58, 0, 0, 0)
|
|
|
+ createCabinet(30, 80, 30, -128, 40, -58, 0, 0, 0)
|
|
|
+ createCabinet(30, 80, 30, -160, 40, -58, 0, 0, 0)
|
|
|
+ // createCabinet(30, 80, 30, -192, 40, -58, 0, 0, 0)
|
|
|
+
|
|
|
+ // createCabinet(30, 80, 30, 32, 40, 102, 0, Math.PI, 0);
|
|
|
+ createCabinet(30, 80, 30, 0, 40, 58, 0, Math.PI, 0);
|
|
|
+ createCabinet(30, 80, 30, -32, 40, 58, 0, Math.PI, 0);
|
|
|
+ createCabinet(30, 80, 30, -64, 40, 58, 0, Math.PI, 0);
|
|
|
+ createCabinet(30, 80, 30, -96, 40, 58, 0, Math.PI, 0);
|
|
|
+
|
|
|
+ // 桌子
|
|
|
+ createComputerDesk(82, 0, 57,0,Math.PI / 2,0)
|
|
|
+
|
|
|
+ // 椅子
|
|
|
+ createChair(90, 17, 32, 0, Math.PI, 0);
|
|
|
+
|
|
|
+ // 电脑
|
|
|
+ createComputer(90, 65, 57, 0, Math.PI, 0);
|
|
|
+
|
|
|
+ //精灵字体
|
|
|
+ // createMark()
|
|
|
+ }
|
|
|
+
|
|
|
+ // 创建地板
|
|
|
+ function createFloor(width, height){
|
|
|
+ var floorGeometry = new THREE.PlaneGeometry(width, height);
|
|
|
+ var maps = textureLoader.load('./images/floor.png');
|
|
|
+ maps.wrapS = maps.wrapT = THREE.RepeatWrapping;
|
|
|
+ maps.repeat.set( 8, 6);
|
|
|
+ maps.needsUpdate = true
|
|
|
+
|
|
|
+ var material = new THREE.MeshBasicMaterial({
|
|
|
+ map: maps,
|
|
|
+ side: THREE.DoubleSide
|
|
|
+ });
|
|
|
+ var floor = new THREE.Mesh( floorGeometry, material );
|
|
|
+ floor.rotation.x = Math.PI / 2;
|
|
|
+ scene.add(floor);
|
|
|
+ return floor;
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ // 创建墙
|
|
|
+ function createWall(w, h, d, px, py, pz, rx, ry, rz, holes) {
|
|
|
+ var geometry = new THREE.BoxGeometry(w, h, d);
|
|
|
+ var meterials = new THREE.MeshStandardMaterial({
|
|
|
+ color: 0xA5A5A5,
|
|
|
+ side: THREE.DoubleSide
|
|
|
+ });
|
|
|
+ var wall = new THREE.Mesh(geometry, meterials);
|
|
|
+ if (holes) {
|
|
|
+ for (var i = 0; i < holes.length; i++) {
|
|
|
+ var totalBSP = new ThreeBSP(wall);
|
|
|
+ var hole = holes[i];
|
|
|
+ var holeGeometry = new THREE.BoxGeometry(hole.size[0], hole.size[1], hole.size[2]);
|
|
|
+ var holeCube = new THREE.Mesh(holeGeometry);
|
|
|
+ holeCube.position.x = hole.position[0];
|
|
|
+ holeCube.position.y = hole.position[1];
|
|
|
+ holeCube.position.z = hole.position[2];
|
|
|
+
|
|
|
+ holeCube.rotation.x = hole.rotation[0];
|
|
|
+ holeCube.rotation.y = hole.rotation[1];
|
|
|
+ holeCube.rotation.z = hole.rotation[2];
|
|
|
+
|
|
|
+ var clipBSP = new ThreeBSP(holeCube);
|
|
|
+
|
|
|
+ var resultBSP = totalBSP.subtract(clipBSP);
|
|
|
+
|
|
|
+ wall = resultBSP.toMesh();
|
|
|
+ }
|
|
|
+
|
|
|
+ wall.material = meterials;
|
|
|
+ }
|
|
|
+
|
|
|
+ wall.position.x = px;
|
|
|
+ wall.position.y = py;
|
|
|
+ wall.position.z = pz;
|
|
|
+
|
|
|
+ wall.rotation.x = rx;
|
|
|
+ wall.rotation.y = ry;
|
|
|
+ wall.rotation.z = rz;
|
|
|
+
|
|
|
+ scene.add(wall);
|
|
|
+ return wall;
|
|
|
+ }
|
|
|
+
|
|
|
+ function createGlassWall (w, h, d, px, py, pz, rx, ry, rz, holes,opa) {
|
|
|
+ var geometry = new THREE.BoxGeometry(w, h, d);
|
|
|
+ var texture = new textureLoader.load('./images/jsk.png');
|
|
|
+ texture.wrapS = texture.wrapT = THREE.RepeatWrapping;
|
|
|
+ texture.repeat.set(1, 1);
|
|
|
+ var meterials = new THREE.MeshStandardMaterial({
|
|
|
+ // color: 0xD6F2F2,
|
|
|
+ color: 0xEFF8FC,
|
|
|
+ // map: texture,
|
|
|
+ opacity: opa,
|
|
|
+ transparent: true,
|
|
|
+ side: THREE.DoubleSide
|
|
|
+ });
|
|
|
+ var glassW = new THREE.Mesh(geometry, meterials);
|
|
|
+ if (holes) {
|
|
|
+ for (var i = 0; i < holes.length; i++) {
|
|
|
+ var totalBSP = new ThreeBSP(glassW);
|
|
|
+ var hole = holes[i];
|
|
|
+ var holeGeometry = new THREE.BoxGeometry(hole.size[0], hole.size[1], hole.size[2]);
|
|
|
+ var holeCube = new THREE.Mesh(holeGeometry);
|
|
|
+ holeCube.position.x = hole.position[0];
|
|
|
+ holeCube.position.y = hole.position[1];
|
|
|
+ holeCube.position.z = hole.position[2];
|
|
|
+
|
|
|
+ holeCube.rotation.y = hole.rotation[1];
|
|
|
+
|
|
|
+ var clipBSP = new ThreeBSP(holeCube);
|
|
|
+
|
|
|
+ var resultBSP = totalBSP.subtract(clipBSP);
|
|
|
+
|
|
|
+ glassW = resultBSP.toMesh();
|
|
|
+ }
|
|
|
+
|
|
|
+ glassW.material = meterials;
|
|
|
+ }
|
|
|
+
|
|
|
+ glassW.position.x = px;
|
|
|
+ glassW.position.y = py;
|
|
|
+ glassW.position.z = pz;
|
|
|
+
|
|
|
+ glassW.rotation.y = ry;
|
|
|
+
|
|
|
+ scene.add(glassW);
|
|
|
+
|
|
|
+ return glassW;
|
|
|
+ }
|
|
|
+
|
|
|
+ //加载门Fbx格式
|
|
|
+ function createDoor (px,py,pz) {
|
|
|
+ const fbxloader = new THREE.FBXLoader();
|
|
|
+ fbxloader.load("./model/door.fbx",function (obj) {
|
|
|
+ const item = obj.children[0];
|
|
|
+ item.scale.set(0.03, 0.05, 0.03);
|
|
|
+ item.position.set(px,py,pz);
|
|
|
+ obj.castShadow = true;
|
|
|
+ //尝试制作动画部分
|
|
|
+ // const children1 = item.children[0];
|
|
|
+ // const children4 = item.children[3];
|
|
|
+ // children1.rotation.z = Math.PI/2;
|
|
|
+ // children1.position.set(-1100,500,0);
|
|
|
+ // children4.rotation.z = Math.PI/2;
|
|
|
+ // children4.position.set(-1100,500,0);
|
|
|
+ // mixer = new THREE.AnimationMixer(item);
|
|
|
+ // var AnimationAction=mixer.clipAction(obj.animations[0]);
|
|
|
+ // AnimationAction.timeScale = 2;
|
|
|
+ // AnimationAction.clampWhenFinished=true;
|
|
|
+ // AnimationAction.play();
|
|
|
+ scene.add(obj)
|
|
|
+ });
|
|
|
+ }
|
|
|
+
|
|
|
+ //创建机柜
|
|
|
+ function createCabinet(w, h, d, px, py, pz, rx, ry, rz) {
|
|
|
+ var texture = new THREE.ImageUtils.loadTexture('./images/rack_door_front.png');
|
|
|
+ texture.wrapS = texture.wrapT = THREE.RepeatWrapping;
|
|
|
+ texture.repeat.set(1, 1);
|
|
|
+
|
|
|
+ var texture2 = new THREE.ImageUtils.loadTexture('./images/rack_door_back.png');
|
|
|
+ texture2.wrapS = texture2.wrapT = THREE.RepeatWrapping;
|
|
|
+ texture2.repeat.set(1, 1);
|
|
|
+
|
|
|
+ var geometry = new THREE.BoxGeometry(w, h, d);
|
|
|
+ //var material = new THREE.MeshBasicMaterial( { map: texture } );
|
|
|
+ // Create an array of materials to be used in a cube, one for each side
|
|
|
+ var materialArray = [];
|
|
|
+ // order to add materials: x+,x-,y+,y-,z+,z-
|
|
|
+ materialArray.push(new THREE.MeshBasicMaterial({
|
|
|
+ map: texture2
|
|
|
+ }));
|
|
|
+ materialArray.push(new THREE.MeshBasicMaterial({
|
|
|
+ map: texture2
|
|
|
+ }));
|
|
|
+ materialArray.push(new THREE.MeshBasicMaterial({
|
|
|
+ map: texture2
|
|
|
+ }));
|
|
|
+ materialArray.push(new THREE.MeshBasicMaterial({
|
|
|
+ map: texture2
|
|
|
+ }));
|
|
|
+ materialArray.push(new THREE.MeshBasicMaterial({
|
|
|
+ map: texture
|
|
|
+ }));
|
|
|
+ materialArray.push(new THREE.MeshBasicMaterial({
|
|
|
+ map: texture2
|
|
|
+ }));
|
|
|
+ var material = new THREE.MeshFaceMaterial(materialArray);
|
|
|
+
|
|
|
+ var cabinet = new THREE.Mesh(geometry, material);
|
|
|
+
|
|
|
+ cabinet.position.x = px;
|
|
|
+ cabinet.position.y = py;
|
|
|
+ cabinet.position.z = pz;
|
|
|
+
|
|
|
+ cabinet.rotation.y = ry;
|
|
|
+
|
|
|
+ scene.add(cabinet);
|
|
|
+
|
|
|
+
|
|
|
+ return cabinet;
|
|
|
+ }
|
|
|
+
|
|
|
+ // 创建桌子
|
|
|
+ function createComputerDesk(px, py, pz, rx, ry, rz) {
|
|
|
+ // 加载 glTF 格式的模型
|
|
|
+ let loader = new THREE.GLTFLoader(); /*实例化加载器*/
|
|
|
+ var textureNormal = textureLoader.load('./images/ambient_occlusion.jpg');
|
|
|
+ loader.load('./model/dnz.gltf', function(obj) {
|
|
|
+ console.log(obj);
|
|
|
+ obj.scene.scale.set(5, 10, 5);
|
|
|
+ obj.scene.position.x = px;
|
|
|
+ obj.scene.position.y = py;
|
|
|
+ obj.scene.position.z = pz;
|
|
|
+
|
|
|
+ obj.scene.rotation.y = ry;
|
|
|
+
|
|
|
+ obj.scene.traverse(function (gltf) {
|
|
|
+ if(gltf.type === 'Mesh'){
|
|
|
+ gltf.material = new THREE.MeshPhongMaterial({
|
|
|
+ color: 0xcccccc,
|
|
|
+ map:textureNormal,
|
|
|
+ normalScale: new THREE.Vector2(1, 1),
|
|
|
+ })
|
|
|
+ }
|
|
|
+
|
|
|
+ })
|
|
|
+
|
|
|
+ scene.add(obj.scene);
|
|
|
+ })
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ // 创建椅子
|
|
|
+ function createChair(px, py, pz, rx, ry, rz) {
|
|
|
+
|
|
|
+ // 加载 glTF 格式的模型
|
|
|
+ let loader = new THREE.GLTFLoader(); /*实例化加载器*/
|
|
|
+
|
|
|
+ loader.load('./fourImages/chair.gltf', function(obj) {
|
|
|
+ //console.log(obj.scene.children);
|
|
|
+ obj.scene.scale.set(0.5, 0.5, 0.5);
|
|
|
+ obj.scene.position.x = px;
|
|
|
+ obj.scene.position.y = py;
|
|
|
+ obj.scene.position.z = pz;
|
|
|
+
|
|
|
+ obj.scene.rotation.y = ry;
|
|
|
+ scene.add(obj.scene);
|
|
|
+
|
|
|
+ })
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ // 创建电脑
|
|
|
+ function createComputer(px, py, pz, rx, ry, rz) {
|
|
|
+ // 加载 glTF 格式的模型
|
|
|
+ let loader = new THREE.GLTFLoader(); /*实例化加载器*/
|
|
|
+ loader.load('./fourImages/computer.gltf', function(obj) {
|
|
|
+ obj.scene.scale.set(0.5, 0.5, 0.5);
|
|
|
+ obj.scene.position.x = px;
|
|
|
+ obj.scene.position.y = py;
|
|
|
+ obj.scene.position.z = pz;
|
|
|
+ obj.scene.rotation.y = ry;
|
|
|
+ scene.add(obj.scene);
|
|
|
+ })
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ //创建精灵字体
|
|
|
+ function createMark () {
|
|
|
+ var texture = new THREE.TextureLoader().load("./images/dakuang.png");
|
|
|
+ var spriteMaterial = new THREE.SpriteMaterial({
|
|
|
+ color:0xff00ff,//设置精灵矩形区域颜色
|
|
|
+ rotation:Math.PI/4,//旋转精灵对象45度,弧度值
|
|
|
+ map: texture,//设置精灵纹理贴图
|
|
|
+ });
|
|
|
+ var sprite = new THREE.Sprite(spriteMaterial);
|
|
|
+ sprite.scale.set(10, 10, 1);
|
|
|
+ scene.add(sprite);
|
|
|
+ return sprite;
|
|
|
+ }
|
|
|
+
|
|
|
+ function animate() {
|
|
|
+ requestAnimationFrame(animate);
|
|
|
+ render();
|
|
|
+ update();
|
|
|
+ }
|
|
|
+
|
|
|
+ // 更新插件
|
|
|
+ function update() {
|
|
|
+ controls.update();
|
|
|
+ stats.update();
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ function render() {
|
|
|
+ renderer.render(scene, camera);
|
|
|
+
|
|
|
+ }
|
|
|
+</script>
|
|
|
+
|
|
|
+
|
|
|
+</body>
|
|
|
+</html>
|