From ccac630f50607003fa6fbbd5d22280248a0f4144 Mon Sep 17 00:00:00 2001 From: yinmb Date: Sat, 20 Feb 2021 15:05:18 +0800 Subject: [PATCH] add multi instance support and fix camera pos --- 20210129/demo/Readme.md | 2 ++ 20210129/demo/js/loader.js | 29 +++++++++++++++++++++-------- 20210129/demo/js/main.js | 11 +++++++++-- 3 files changed, 32 insertions(+), 10 deletions(-) diff --git a/20210129/demo/Readme.md b/20210129/demo/Readme.md index 803868b..6a7745e 100644 --- a/20210129/demo/Readme.md +++ b/20210129/demo/Readme.md @@ -10,5 +10,7 @@ 5. 运行wamp程序,浏览器输入网址:[http://localhost/demo/index.html](http://localhost/demo/index.html) +6. 多个网格组成的构件,可以将构件的mesh值改为数组形式,里面放入多个网格位置索引 + # Q&A记录 diff --git a/20210129/demo/js/loader.js b/20210129/demo/js/loader.js index b5a4fd0..d422eda 100644 --- a/20210129/demo/js/loader.js +++ b/20210129/demo/js/loader.js @@ -20,7 +20,7 @@ BIMLoader = function(json) var scene = new THREE.Scene(); json.instances.forEach(element => { - var object = ParseInstance(element, meshes[element.mesh]); + var object = ParseInstance(element, meshes, element.mesh); scene.add(object); }); @@ -55,7 +55,7 @@ BIMLoader = function(json) return geometry; } - function ParseInstance(instanceJson, mesh) + function ParseInstance(instanceJson, meshes, index) { var obj = new THREE.Object3D(); @@ -77,13 +77,26 @@ BIMLoader = function(json) if(instanceJson.info) obj.userData = instanceJson.info; - // 边框 - var edges = new THREE.EdgesGeometry(mesh.geometry); - var line = new THREE.LineSegments(edges, new THREE.LineBasicMaterial({color: 0xff0000})); - - obj.add(mesh); - obj.add(line); + if(Array.isArray(index)) + { + index.forEach(element => { + PutMesh(meshes[element], obj); + }); + } + else + { + PutMesh(meshes[index], obj); + } return obj; } + + function PutMesh(mesh, obj) + { + var edges = new THREE.EdgesGeometry(mesh.geometry); + var line = new THREE.LineSegments(edges, new THREE.LineBasicMaterial({color: 0xff0000})); + + obj.add(mesh); + obj.add(line); + } } \ No newline at end of file diff --git a/20210129/demo/js/main.js b/20210129/demo/js/main.js index c213891..b156bdc 100644 --- a/20210129/demo/js/main.js +++ b/20210129/demo/js/main.js @@ -28,8 +28,15 @@ loader.load( var bimScene = BIMLoader(JSON.parse(data)); var box = new THREE.Box3(); box.expandByObject(bimScene); - box.expandByScalar(10000); - var cameraPos = new THREE.Vector3(box.min.x, box.min.y, box.max.z); + var center = new THREE.Vector3(); + box.getCenter(center); + var size = new THREE.Vector3(); + box.getSize(size); + var result = size.x > size.y ? size.x : size.y; + result = result > size.z ? result : size.z; + var maxLength = Math.round(result); + var radius = center.distanceTo(new THREE.Vector3(center.x + (maxLength/2), center.y + (maxLength/2), center.z + (maxLength/2))); + var cameraPos = new THREE.Vector3(center.x + radius * Math.cos(Math.PI/18) * Math.cos(Math.PI/4), center.y - radius * Math.cos(Math.PI/18) * Math.sin(Math.PI/4), center.z + radius * Math.sin(Math.PI/18)); camera.position.copy(cameraPos); controls.target = box.getCenter(); scene.add(bimScene);