BIMLoader = function(json) { // 解析材质 var materials = new Array(); json.materials.forEach(element => { var material = ParseMaterial(element); materials.push(material); }); // 解析网格 var meshes = new Array(); json.meshes.forEach(element => { var geometry = ParseGeometry(element); var material = materials[element.material]; var mesh = new THREE.Mesh(geometry, material); meshes.push(mesh); }); // 解析物体 var scene = new THREE.Scene(); json.instances.forEach(element => { var object = ParseInstance(element, meshes, element.mesh); scene.add(object); }); return scene; function ParseMaterial(materialJson) { var material = new THREE.MeshPhongMaterial(); if(materialJson.color) material.color.setStyle(materialJson.color); if(materialJson.transparent) { material.transparent = true; material.opacity = materialJson.transparent; } return material; } function ParseGeometry(geometryJson) { var geometry = new THREE.BufferGeometry(); geometry.setAttribute('position', new THREE.BufferAttribute(new Float32Array(geometryJson.vertices), 3)); geometry.setIndex(new THREE.BufferAttribute(new Uint32Array(geometryJson.indices), 1)); geometry.setAttribute('normal', new THREE.BufferAttribute(new Float32Array(geometryJson.normals), 3)); return geometry; } function ParseInstance(instanceJson, meshes, index) { var obj = new THREE.Object3D(); if(instanceJson.id) obj.name = instanceJson.id; if(instanceJson.transform) { var matrix4 = new THREE.Matrix4(); matrix4.fromArray(instanceJson.transform); obj.matrixAutoUpdate = false; obj.matrix.copy(matrix4); obj.matrixWorldNeedsUpdate = true; } if(instanceJson.visible) obj.visible = instanceJson.visible; if(instanceJson.info) obj.userData = instanceJson.info; 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); } }