89 lines
2.4 KiB
JavaScript
89 lines
2.4 KiB
JavaScript
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, mesh)
|
|
{
|
|
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;
|
|
|
|
// 边框
|
|
var edges = new THREE.EdgesGeometry(mesh.geometry);
|
|
var line = new THREE.LineSegments(edges, new THREE.LineBasicMaterial({color: 0xff0000}));
|
|
|
|
obj.add(mesh);
|
|
obj.add(line);
|
|
|
|
return obj;
|
|
}
|
|
} |