emsApplication/applications/WebConfigure/web/js/parts.js

967 lines
33 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

var BasePart = {
create:function(mdc){
return {
id:'partId',
category:'NA',
shape:null,
currentShape:null,
powerShape:null,
spaceShape:null,
states:{
expanded:false,
selected:false
},
option:{
expandPosition:{x:0,y:0,z:0}
},
dispose:function(mdc){
mdc.scene.remove(this.shape);
if (this.id === "mapA"){
var svg = this.shape.children[0].children[0].material.map.image;
//delete this.shape.children[0].children[0].material.map;
}
PartManager.disposeShape(this.shape);
//if (svg) console.log(svg);
if (this.powerShape) {
mdc.scene.remove(this.powerShape);
PartManager.disposeShape(this.powerShape);
}
if (this.spaceShape) {
mdc.scene.remove(this.spaceShape);
PartManager.disposeShape(this.spaceShape);
}
},
init:function(){
this.shape.updateMatrixWorld(true);
this.setCurrentShape(this.shape);
//this.option.originPosition = this.shape.position.clone();
},
setCurrentShape:function(shape){
this.currentShape = this.shape;
},
stagePower:function(mdc){
var percent = 0.01;
if (this.category !== "rack") return;
if (this.currentShape) this.currentShape.visible = false;
if (this.powerShape) {
mdc.scene.remove(this.powerShape);
PartManager.disposeShape(this.powerShape);
//this.powerShape.visible = true;
}
if (!this.info) return;
percent = this.info.activePower/this.info.ratedPower;
this.powerShape = this.createPowerShape(this.shape.originPosition, percent);
mdc.scene.add(this.powerShape);
this.powerShape.position.copy(this.currentShape.position);
this.powerShape.rotation.copy(mdc.parts[0].currentShape.rotation);
this.currentShape = this.powerShape;
},
stageDefault:function(mdc){
if (this.category !== "rack") return;
this.currentShape.visible = false;
this.shape.position.copy(this.currentShape.position);
this.shape.rotation.copy(mdc.parts[0].currentShape.rotation);
this.currentShape = this.shape;
this.currentShape.visible = true;
},
getWorldPosition:function(){
//scene.updateMatrixWorld(true);
var position = new THREE.Vector3();
if (this.category === "rack")
{
position.setFromMatrixPosition( this.currentShape.children[0].children[0].matrixWorld);
// if (this.currentShape === this.powerShape){
// position.setFromMatrixPosition( this.currentShape.children[0].matrixWorld);
// }
// if (this.currentShape === this.shape){
// position.setFromMatrixPosition( this.currentShape.children[0].children[0].matrixWorld);
// }
}
else if (this.category === "base"){
position.setFromMatrixPosition( this.currentShape.matrixWorld);
}
else{
position.setFromMatrixPosition( this.currentShape.children[0].matrixWorld);
}
return position;
},
stageSpace:function(mdc){
var devs = [];
if (this.category !== "rack") return;
if (this.currentShape) this.currentShape.visible = false;
if (this.spaceShape) {
mdc.scene.remove(this.spaceShape);
PartManager.disposeShape(this.spaceShape);
}
if (!this.info) return;
if (this.info.devices) devs = this.info.devices;
this.spaceShape = this.createSpaceShape(this.shape.originPosition, devs);
mdc.scene.add(this.spaceShape);
this.spaceShape.position.copy(this.currentShape.position);
this.spaceShape.rotation.copy(mdc.parts[0].currentShape.rotation);
this.currentShape = this.spaceShape;
},
createSpaceShape:function(pos, devices){
var group = new THREE.Object3D();
var geometry = new THREE.BoxGeometry( 55, 200, 80 );
var material = new THREE.MeshBasicMaterial( {
color: 0xB0CFF0, "transparent":true,"opacity":0.2,depthWrite:false
} );
var geo = new THREE.EdgesGeometry( geometry ); // or WireframeGeometry( geometry )
var mat = new THREE.LineBasicMaterial( { color: 0xB0CFF0, linewidth: 1 , "transparent":true,"opacity":0.3} );
var wireframe = new THREE.LineSegments( geo, mat );
var cube = new THREE.Mesh( geometry, material);
var that = this;
devices.forEach(function(dev){
group.add(that.createServerShape(dev.uIndex,dev.uHigh));
});
group.add(cube);
group.add(wireframe);
group.position.x = pos.x;
group.position.y = pos.y;
group.position.z = pos.z;
group.rotateY( 0 - PartManager.radians(90));
var grp = new THREE.Object3D();
grp.add(group);
return grp;
},
createServerShape:function(uIndex,uSize){
//var uh = 4.445;
var uh = 4.7;
var geometry2 = new THREE.BoxGeometry( 50, uh * uSize, 79 );
var material2 = new THREE.MeshBasicMaterial( {
color: 0x84a0ac, "transparent":true,"opacity":0.8,depthWrite:false
} );
//var geo = new THREE.EdgesGeometry( geometry );
//var mat = new THREE.LineBasicMaterial( { color: 0xB0CFF0, linewidth: 1 , "transparent":true,"opacity":0.3} );
//var wireframe = new THREE.LineSegments( geo, mat );
var cube = new THREE.Mesh( geometry2, material2);
cube.position.y = uIndex * uh + (uh * uSize) / 2 - 100;
return cube;
},
createPowerShape:function(pos, percent){
var group = new THREE.Object3D();
var geometry = new THREE.BoxGeometry( 55, 200, 80 );
var material = new THREE.MeshBasicMaterial( {
color: 0xB0CFF0, "transparent":true,"opacity":0.2,depthWrite:false
} );
var geometry2 = new THREE.BoxGeometry( 50, 200 * percent, 79 );
var material2 = new THREE.MeshBasicMaterial( {
color: 0xB0CFF0, "transparent":true,"opacity":0.4,depthWrite:false
} );
var geo = new THREE.EdgesGeometry( geometry ); // or WireframeGeometry( geometry )
var mat = new THREE.LineBasicMaterial( { color: 0xB0CFF0, linewidth: 1 , "transparent":true,"opacity":0.3} );
var wireframe = new THREE.LineSegments( geo, mat );
var cube = new THREE.Mesh( geometry, material);
var cube2 = new THREE.Mesh( geometry2, material2);
cube2.position.y = 100 * (percent - 1) + 1;
group.add(cube2);
group.add(cube);
group.add(wireframe);
group.position.x = pos.x;
group.position.y = pos.y;
group.position.z = pos.z;
group.rotateY( 0 - PartManager.radians(90));
var grp = new THREE.Object3D();
grp.add(group);
return grp;
},
expand:function(){
var that = this;
if (that.states.expanded) return;
//var pos = that.getWorldPosition();
var shp = that.currentShape;
if (this.category === "thermalMap"){
if (this.id === "mapB") that.currentShape.children[0].position.x = -266;
if (this.id === "mapA") that.currentShape.children[0].position.x = 266;
that.states.expanded = true;
return;
}
new TWEEN.Tween(shp.position).to({
x: that.option.expandPosition.x,
y: that.option.expandPosition.y,
z: that.option.expandPosition.z
},1000).delay(Math.floor((Math.random() * 1000) + 1)).easing(TWEEN.Easing.Linear.None).onComplete(function () {
that.states.expanded = true;
}).start();
new TWEEN.Tween(shp.rotation).to({
x: 0,
y: 0,
z: 0
},1000).delay(Math.floor((Math.random() * 1000) + 1)).easing(TWEEN.Easing.Linear.None).onComplete(function () {
that.states.expanded = true;
}).start();
},
collapse:function(){
var that = this;
if (!that.states.expanded) return;
//var pos = that.getWorldPosition();
// if (this.category === "rack" && this.id==="rack1"){
// console.log(that.getWorldPosition().x,that.getWorldPosition().y,that.getWorldPosition().z);
// }
if (this.category === "thermalMap"){
if (this.id === "mapA") that.currentShape.children[0].position.x = -166;
if (this.id === "mapB") that.currentShape.children[0].position.x = 166;
that.states.expanded = false;
return;
}
new TWEEN.Tween(that.currentShape.position).to({
x: 0,//that.option.originPosition.x,
y: 0,//that.option.originPosition.y,
z: 0//that.option.originPosition.z
},1000).delay(Math.floor((Math.random() * 1000) + 1))
.easing(TWEEN.Easing.Linear.None).onComplete(function () {
that.states.expanded = false;
}).start();
}
};
}
};
var PartManager = {
buildPart: function(partId,partCategory, shp, opt){
var part = _.extend(BasePart.create(), {id:partId,category:partCategory, shape: shp, option: opt});
part.shape.partId = partId;
return part;
},
disposeObject: function(obj){
for(var b in obj){
if(typeof(obj[b]) === "function" && obj[b].name === "event"){
obj[b] = undefined;
}
else if(typeof(obj[b]) === "function" && obj[b].length > 0){
disposeObject(obj[b]);
}
else if(typeof(obj[b]) === "object" && b === "dispatch"){
disposeObject(obj[b]);
}
}
},
disposeShape: function(obj) {
if (obj !== null) {
for (var i = 0; i < obj.children.length; i++) {
PartManager.disposeShape(obj.children[i]);
}
if(obj.dispose) {
obj.dispose();
}
if (obj.geometry) {
obj.geometry.dispose();
obj.geometry = undefined;
}
if (obj.material) {
if (obj.material instanceof THREE.MeshFaceMaterial) {
$.each(obj.material.materials, function(idx, o) {
if (!o) return;
if (o.map)
{
o.map.dispose();
o.map = undefined;
delete o.map;
}
o.dispose();
});
} else {
obj.material.dispose();
if (obj.material.map){
obj.material.map.dispose();
delete obj.material.map;
}
}
}
}
obj = undefined;
},
createBase: function(rowNumber) {
//地板
var bZ1 = 740 - (12 - rowNumber)*60;
var bZ2 = (12 - rowNumber)*30;
if(rowNumber > 12){
bZ1 += (rowNumber - 12);
bZ2 -= (rowNumber - 12)/2;
}
//右边台阶
var sZ = (12 - rowNumber)*60 - 380;
var group = new THREE.Object3D();
var baseForm = this.baseObject({x: 340, y: 40, z: bZ1 }, {x: 0, y: 20,z: bZ2});
var stageL1 = this.baseObject({x: 150, y: 15, z: 100 }, {x: 0, y: 7.5,z: 380});
var stageL2 = this.baseObject({x: 150, y: 30, z: 50 }, {x: 0, y: 15,z: 380});
var stageR1 = this.baseObject({x: 150, y: 15, z: 100 }, {x: 0, y: 7.5,z: sZ});
var stageR2 = this.baseObject({x: 150, y: 30, z: 50 }, {x: 0, y: 15,z: sZ});
group.add(baseForm);
group.add(stageL1);
group.add(stageL2);
group.add(stageR1);
group.add(stageR2);
group.castShadow = true;
group.receiveShadow = true;
var option = { expandPosition:{x:0,y:-100,z:0} };
return this.buildPart('base','base',group, option);
},
createWaterLeakageA: function(rowNumber) {
var z1 = (12 - rowNumber)*30 - 340;
var z2 = 340 - (12 - rowNumber)*30;
var oz = -(rowNumber - 12)*30;
var group = new THREE.Object3D();
function makeLine(geo, color) {
var g = new MeshLine();
g.setGeometry(geo);
material = new MeshLineMaterial({
color: new THREE.Color(0xffbb11),
//color: new THREE.Color( "rgb(200, 20, 20)" ),
//opacity: 1,
resolution: new THREE.Vector2(window.innerWidth, window.innerHeight),
sizeAttenuation: 11,
lineWidth: 12,
//near: 1,
//far: 100000,
//depthTest: true,
//depthWrite:true,
blending: THREE.Subtractive,
//transparent: false,
side: THREE.DoubleSide
});
var mesh = new THREE.Mesh(g.geometry, material);
//mesh.frustumCulled = false;
group.add(mesh);
};
var geometry = new THREE.Geometry();
geometry.vertices.push(new THREE.Vector3(50, 42, z1));
geometry.vertices.push(new THREE.Vector3(142, 42, z1));
geometry.vertices.push(new THREE.Vector3(142, 42, z2));
geometry.vertices.push(new THREE.Vector3(50, 42, z2));
geometry.vertices.push(new THREE.Vector3(50, 42, z1));
makeLine(geometry);
var option = { expandPosition:{x:0,y:-100,z:oz} };
return this.buildPart('waterLeakageA','waterLeakage',group, option);
},
createWaterLeakageB: function(rowNumber) {
var z1 = (12 - rowNumber)*30 - 340;
var z2 = 340 - (12 - rowNumber)*30;
var oz = -(rowNumber - 12)*30;
var group = new THREE.Object3D();
function makeLine(geo, color) {
var g = new MeshLine();
g.setGeometry(geo);
var material = new MeshLineMaterial({
color: new THREE.Color(0xffbb11),
//color: new THREE.Color( "rgb(200, 20, 20)" ),
//opacity: 1,
resolution: new THREE.Vector2(window.innerWidth, window.innerHeight),
sizeAttenuation: 11,
lineWidth: 12,
//near: 1,
//far: 100000,
//depthTest: true,
//depthWrite:true,
blending: THREE.Subtractive,
//transparent: false,
side: THREE.DoubleSide
});
var mesh = new THREE.Mesh(g.geometry, material);
//mesh.frustumCulled = false;
group.add(mesh);
};
var geometry = new THREE.Geometry();
geometry.vertices.push(new THREE.Vector3(-50, 42, z1));
geometry.vertices.push(new THREE.Vector3(-142, 42, z1));
geometry.vertices.push(new THREE.Vector3(-142, 42, z2));
geometry.vertices.push(new THREE.Vector3(-50, 42, z2));
geometry.vertices.push(new THREE.Vector3(-50, 42, z1));
makeLine(geometry);
var option = { expandPosition:{x:0,y:-100,z:oz} };
return this.buildPart('waterLeakageB','waterLeakage',group, option);
},
createDoors:function(rowNumber){
//右边门
var dZ2 = (12 - rowNumber)*60 - 372;
var res = [];
var group1 = new THREE.Object3D();
var group2 = new THREE.Object3D();
var cfgDoorA = {
faces:{
topFace: { texture: 'img/3d/molds/dark.png'},
bottomFace: { texture: 'img/3d/molds/dark.png'},
leftFace: { texture: 'img/3d/molds/dark.png' },
rightFace: { texture: 'img/3d/molds/dark.png' },
frontFace: { texture: 'img/3d/molds/rackdoorA1.png', color: 0xffffff,transparent:true,opacity: 1},
backFace: { texture: 'img/3d/molds/rackdoorB1.png', color: 0xffffff,transparent:true,opacity: 1}
}
};
var cfgDoorB = {
faces:{
topFace: { texture: 'img/3d/molds/dark.png'},
bottomFace: { texture: 'img/3d/molds/dark.png'},
leftFace: { texture: 'img/3d/molds/dark.png' },
rightFace: { texture: 'img/3d/molds/dark.png' },
frontFace: { texture: 'img/3d/molds/rackdoorB1.png', color: 0xffffff,transparent:true,opacity: 1},
backFace: { texture: 'img/3d/molds/rackdoorA1.png', color: 0xffffff,transparent:true,opacity: 1}
}
};
var doorA1 = this.cubeObject({x: 90, y: 198, z: 9 }, {x: -44, y: 138,z: 372},cfgDoorA);
var doorB1 = this.cubeObject({x: 90, y: 198, z: 9 }, {x: 44, y: 138,z: 372},cfgDoorB);
group1.add(doorA1);
group1.add(doorB1);
var option1 = { expandPosition:{x:0,y:0,z:100} };
res.push(this.buildPart('door1','door',group1, option1));
var doorA2 = this.cubeObject({x: 90, y: 198, z: 9 }, {x: -44, y: 138,z: dZ2},cfgDoorA);
var doorB2 = this.cubeObject({x: 90, y: 198, z: 9 }, {x: 44, y: 138,z: dZ2},cfgDoorB);
group2.add(doorA2);
group2.add(doorB2);
var option2 = { expandPosition:{x:0,y:0,z:-100} };
res.push(this.buildPart('door2','door',group2, option2));
return res;
},
createCeiling: function(rowNumber){
var fine = rowNumber - 12;
//右边门横木
var dZ2 = -(rowNumber - 12)*60 - 370 - fine;
//天窗右边框
var bZ2 = -(rowNumber - 12)*60 - 360;
//天窗上下边框
var cZ1 = 740 - (12 - rowNumber)*60;
var cZ2 = (12 - rowNumber)*30;
//电缆走线架
var tZ1 = cZ1;
var tZ2 = cZ2;
var wt1 = 0,wt2 = 0;
if(rowNumber*2%8 == 6){
wt1 = 10;
wt2 = 5;
}else if(rowNumber*2%8 == 4){
wt1 = 20;
wt2 = 10;
}
var group = new THREE.Object3D();
var cfgAssets = {
faces:{
topFace: { texture: 'img/3d/molds/dark.png' },
bottomFace: { texture: 'img/3d/molds/dark.png' },
leftFace: { texture: 'img/3d/molds/dark.png' },
rightFace: { texture: 'img/3d/molds/dark.png' },
frontFace: { texture: 'img/3d/molds/dark.png' },
backFace: { texture: 'img/3d/molds/dark.png' }
}
};
var doorRail1 = this.cubeObject({x: 300, y: 10, z: 10 }, {x: 0, y: 240,z: 370},cfgAssets);
var beam1 = this.cubeObject({x: 160, y: 30, z: 20+wt1 }, {x: 0, y: 260,z: 360-wt2},cfgAssets);
var doorRail2 = this.cubeObject({x: 300, y: 10, z: 10 }, {x: 0, y: 240,z: dZ2},cfgAssets);
var beam2 = this.cubeObject({x: 160, y: 30, z: 20+wt1 }, {x: 0, y: 260,z: bZ2+wt2},cfgAssets);
group.add(doorRail1);
group.add(beam1);
group.add(doorRail2);
group.add(beam2);
var cfgWindow = {
faces:{
topFace: { texture: 'img/3d/molds/ceilingwindow.png',tileWay:'T',textureSize:80, color: 0x888888,transparent:true,opacity: 0.8, widthSize:80,heightSize:740},
bottomFace: { texture: 'img/3d/molds/ceilingwindow.png', tileWay:'T',textureSize:80, color: 0x888888,transparent:true,opacity: 0.8, widthSize:80,heightSize:740},
leftFace: { texture: 'img/3d/molds/dark.png' },
rightFace: { texture: 'img/3d/molds/dark.png' },
frontFace: { texture: 'img/3d/molds/dark.png' },
backFace: { texture: 'img/3d/molds/dark.png' }
}
};
//var ceilingWindow = this.cubeObject({x: 160, y: 5, z: 740 }, {x: 0, y: 270,z: 0},cfgWindow);
var ceilingWindow = new THREE.Object3D();
var wins = this.createWindowParts(rowNumber);
for (var i = wins.length - 1; i >= 0; i--) {
ceilingWindow.add(wins[i]);
}
ceilingWindow.isWindow = true;
group.add(ceilingWindow);
var winCover1 = this.cubeObject({x:40, y:30,z:cZ1}, {x: 95, y: 260,z: cZ2},cfgAssets);
var winCover2 = this.cubeObject({x:40, y:30,z:cZ1}, {x: -95, y: 260,z: cZ2},cfgAssets);
group.add(winCover1);
group.add(winCover2);
var cfgTroughing= {
faces:{
topFace: { texture: 'img/3d/molds/troughing.png',tileWay:'T',textureSize:30, color: 0xffffff,transparent:true,opacity: 1, widthSize:30,heightSize:720},
bottomFace: { texture: 'img/3d/molds/troughing.png',tileWay:'T',textureSize:30, color: 0xffffff,transparent:true,opacity: 1, widthSize:30,heightSize:720},
leftFace: { texture: 'img/3d/molds/troughing.png',tileWay:'T',textureSize:30, color: 0xffffff,transparent:true,opacity: 1, widthSize:30,heightSize:720},
rightFace: { texture: 'img/3d/molds/troughing.png',tileWay:'T',textureSize:30, color: 0xffffff,transparent:true,opacity: 1, widthSize:30,heightSize:720},
frontFace: { texture: 'img/3d/molds/troughing.png', color: 0xffffff,transparent:true,opacity: 1},
backFace: { texture: 'img/3d/molds/troughing.png', color: 0xffffff,transparent:true,opacity: 1}
}
};
var troughing1 = this.cubeObject({x:30, y:15,z:tZ1}, {x: 130, y: 250,z: tZ2},cfgTroughing);
var troughing2 = this.cubeObject({x:30, y:15,z:tZ1}, {x: -130, y: 250,z: tZ2},cfgTroughing);
group.add(troughing1);
group.add(troughing2);
var cfgAlarmer= {
faces:{
topFace: { transparent:true,opacity: 0},
bottomFace: { transparent:true,opacity: 0},
leftFace: {transparent:true,opacity: 0},
rightFace: { transparent:true,opacity: 0},
frontFace: { texture: 'img/3d/molds/alarmer.png',color: 0x9999aa, transparent:true,opacity: 1},
backFace: { transparent:true,opacity: 0}
}
};
var alarmer = this.cubeObject({x:20, y:20,z:0}, {x: 0, y: 260,z: 375},cfgAlarmer);
group.add(alarmer);
var option = { expandPosition:{x:0,y:100,z:0} };
return this.buildPart('ceiling','ceiling',group, option);
},
createWindowParts:function(rowNumber){
//天窗
var w = 740 + (rowNumber - 12)*60;
var cZ = -(rowNumber - 12)*60+10 - 320;
// 微调
var cw = Math.floor(w/80)*80;
var fine = cw - w + 20;
if(rowNumber*2%8 == 6){
fine += 10;
}else if(rowNumber*2%8 == 4){
fine += 20;
}
var wps = [];
var cfgWindow = {
faces:{
topFace: { texture: 'img/3d/molds/ceilingwindow.png',color: 0xffffff,transparent:true,opacity: 1},
bottomFace: { texture: 'img/3d/molds/ceilingwindow.png', color: 0xffffff,transparent:true,opacity: 1},
leftFace: { texture: 'img/3d/molds/dark.png' },
rightFace: { texture: 'img/3d/molds/dark.png' },
frontFace: { texture: 'img/3d/molds/dark.png' },
backFace: { texture: 'img/3d/molds/dark.png' }
}
};
var count = Math.floor(w/80);
for(var i=0;i<count;i++){
var cw = this.cubeObject({x: 154, y: 5, z: 80 }, {x: 0, y: 270,z: cZ + i * 80 - fine},cfgWindow);
wps.push(cw);
}
return wps;
},
createThermalMaps:function(rowNumber){
var rWidth = rowNumber*60;
var rWidths = rWidth + 10;
var maps = [];
var groupLeft = new THREE.Object3D();
var groupRight = new THREE.Object3D();
var grpLeft = new THREE.Object3D();
var grpRight = new THREE.Object3D();
var option = {
panel:{ width: rWidth, height:200},
sensors:[{x:20,y:40,val:0.8},{x:20,y:222,val:0.7},{x:130,y:455,val:0.8},
{x:270,y:405,val:0.3},{x:530,y:55,val:0.9}]
};
var m1 = ThermalMap.toMaterial(option,"A");
var m2 = ThermalMap.toMaterial(option,"B");
var geometry = new THREE.PlaneGeometry(rWidths, 200);
var material1 = m1;
var plane1 = new THREE.Mesh( geometry, material1 );
var material2 = m2;//new THREE.MeshBasicMaterial( {color: 0xffff00, side: THREE.DoubleSide} );
var plane2 = new THREE.Mesh( geometry, material2);
groupLeft.add(plane1);
groupLeft.position.x = -166;
groupLeft.rotateY( 0 - this.radians(90));
//groupLeft.position.y = pos.y;
groupLeft.position.y = 140;
grpLeft.add(groupLeft);
groupRight.add(plane2);
groupRight.position.x = 166;
groupRight.rotateY( 0 - this.radians(90));
//groupRight.position.y = pos.y;
groupRight.position.y = 140;
grpRight.add(groupRight);
var optionLeft = { expandPosition:{x:-100,y:0,z:0} };
var optionRight = { expandPosition:{x:100,y:0,z:0} };
// var geom = new THREE.BoxGeometry( 100, 100, 100 );
// var mate = m;
// var cube = new THREE.Mesh( geom, mate );
maps.push(this.buildPart('mapA','thermalMap',grpLeft, optionLeft));
maps.push(this.buildPart('mapB','thermalMap',grpRight, optionRight));
return maps;
},
createThermalMap:function(side, points, option){
//温场云图
var rowNumber = parseInt(option.number/2);
//宽度
var gWidth = 730 + (rowNumber - 12)*60 + (rowNumber - 12);
//位移
var pZ = (12 - rowNumber)*30 - (rowNumber - 12)/2;
var maps = [];
var groupLeft = new THREE.Object3D();
var groupRight = new THREE.Object3D();
var grpLeft = new THREE.Object3D();
var grpRight = new THREE.Object3D();
var option = {
panel:{ width: 720, height:200},
sensors:points
};
var m = ThermalMap.toMaterial(option,side);
var geometry = new THREE.PlaneGeometry(gWidth, 200);
var material1 = m;
var plane1 = new THREE.Mesh( geometry, material1 );
var material2 = m;//new THREE.MeshBasicMaterial( {color: 0xffff00, side: THREE.DoubleSide} );
var plane2 = new THREE.Mesh( geometry, material2);
groupLeft.add(plane1);
groupLeft.position.x = -166;
groupLeft.rotateY( 0 - this.radians(90));
groupLeft.rotateZ( 0 - this.radians(180));
//groupLeft.position.y = pos.y;
groupLeft.position.y = 140;
groupLeft.position.z = pZ; //平移
grpLeft.add(groupLeft);
groupRight.add(plane2);
groupRight.position.x = 166;
groupRight.rotateY( 0 - this.radians(90));
groupLeft.rotateZ( 0 - this.radians(180));
//groupRight.position.y = pos.y;
groupRight.position.y = 140;
groupRight.position.z = pZ; //平移
grpRight.add(groupRight);
var optionLeft = { expandPosition:{x:-100,y:0,z:0} };
var optionRight = { expandPosition:{x:100,y:0,z:0} };
var geom = new THREE.BoxGeometry( 100, 100, 100 );
var mate = m;
var cube = new THREE.Mesh( geom, mate );
if (side === 'A') return this.buildPart('mapA','thermalMap',grpRight, optionRight);
if (side === 'B') return this.buildPart('mapB','thermalMap',grpLeft, optionLeft);
//maps.push(this.buildPart('mapLeft','thermalMap',grpLeft, optionLeft));
//maps.push(this.buildPart('mapRight','thermalMap',grpRight, optionRight));
//return maps;
},
createCameras:function(rowNumber){
//摄像头位置第6个和第7个机柜之间z0
var cZ1 = 120,cZ2 = -120;
if(rowNumber < 12){
cZ1 = 240;
cZ2 = -240 - (rowNumber-12)*60;
}else if(rowNumber > 12){
cZ2 = -120 - (rowNumber-12)*60;
}
var cs = [];
var option = { expandPosition:{x:0,y:180,z:0} };
var cgrp1 = new THREE.Object3D();
var cgrp2 = new THREE.Object3D();
var cgrpA = new THREE.Object3D();
var cgrpB = new THREE.Object3D();
var createCamera = function(grp){
var loader = new THREE.OBJLoader();
var param ={};
param.color = 0x565656;
param.needsUpdate = true;
param.shading= THREE.SmoothShading;
param.shininess = 100;
param.envMap = reflectionCube;
param.reflectivity = 0.3;
param.refractionRatio = 0.5;
param.depthWrite = true;
loader.load( 'img/3d/molds/Round_SecurityCam_V01.obj', function ( object ) {
object.traverse( function ( child ) {
if ( child instanceof THREE.Mesh )
{
child.material = new THREE.MeshPhongMaterial(param);
}
});
object.scale.set( 4, 4, 4 );
grp.add( object );
var geometry = new THREE.SphereGeometry( 14, 32, 32 ,0,Math.PI * 2,Math.PI, Math.PI /2 + 0.1);
var material = new THREE.MeshPhongMaterial( {
color:0x17202a,
shininess:300,
shading: THREE.SmoothShading,
envMap:reflectionCube,
reflectivity: 0.5,
refractionRatio:0,
depthWrite:true,
transparent:true,
side: THREE.DoubleSide
} );
var sphere = new THREE.Mesh( geometry, material );
sphere.position.y = 5;
grp.add(sphere);
});
};
createCamera(cgrp1);
cgrp1.position.y = 240;
cgrp1.position.z = cZ1;
cgrpA.add(cgrp1);
createCamera(cgrp2);
cgrp2.position.y = 240;
cgrp2.position.z = cZ2;
cgrpB.add(cgrp2);
cs.push(this.buildPart('camera1','camera',cgrpA, option));
cs.push(this.buildPart('camera2','camera',cgrpB, option));
return cs;
},
createCabinets: function(data){
var cabinets = [];
if(data.number){
var optionLeft = { expandPosition:{x:-100,y:0,z:0} };
var optionRight = { expandPosition:{x:100,y:0,z:0} };
var rowNumber = parseInt(parseInt(data.number)/2);
for(var i = 1;i <= parseInt(data.number);i++){
var group = new THREE.Object3D();
var rack = undefined;
var x = 125,z = 335,f = -90;
if(i <= rowNumber){
z = 335 - (i - 1)*61;
}else{
z = 335 - (i - rowNumber - 1)*61;
x = -125;
f = 90;
}
var row = getRackByNumber(data.rowRacks,i);
if(row != undefined){
rack = this.createRack({x: x, y: 140, z: z }, f, row.type);
}else{
rack = this.createRack({x: x, y: 140, z: z }, f, "dark");//dark
}
group.add(rack);
group.originPosition = {x: x, y: 140, z: z };
if(i <= rowNumber){
cabinets.push(this.buildPart("rack"+i,"rack",group, optionRight));
}else{
cabinets.push(this.buildPart("rack"+i,"rack",group, optionLeft));
}
}
}
function getRackByNumber(racks,number){
var obj = undefined;
if(racks){
racks.forEach(function(item){
if(item.site == number) obj = item;
});
}
return obj;
}
return cabinets;
},
createRack : function(position, al, Type){
var group = new THREE.Object3D();
var cfg = {
angle:al,
faces:{
topFace: { texture: 'img/3d/molds/dark.png' },
bottomFace: { texture: 'img/3d/molds/dark.png' },
leftFace: { texture: 'img/3d/molds/dark.png' },
rightFace: { texture: 'img/3d/molds/dark.png' },
frontFace: { texture: 'img/3d/molds/'+Type+'.png' },
backFace: { texture: 'img/3d/molds/dark.png' }
}
};
var rack = this.cubeObject({x:60,y:200,z:80},position,cfg);
if(Type == "dark")
rack.material.visible = false;
//rack.castShadow = true;
//rack.receiveShadow = true;
group.add(rack);
return group;
},
cubeObject: function(size, pos, cfg){
var obj = new THREE.Mesh(new THREE.CubeGeometry(size.x, size.y, size.z).clone(),
new THREE.MeshFaceMaterial(
[
this.newFace(cfg.faces.rightFace), // +x
this.newFace(cfg.faces.leftFace), // -x
this.newFace(cfg.faces.topFace), // +y
this.newFace(cfg.faces.bottomFace), // -y
this.newFace(cfg.faces.frontFace), // +z
this.newFace(cfg.faces.backFace) // -z
]));
obj.position.x = pos.x;
obj.position.y = pos.y;
obj.position.z = pos.z;
if (cfg.angle) obj.rotateY( 0 - this.radians(cfg.angle));
return obj;
},
radians : function(degrees) {
return degrees * Math.PI / 180;
},
baseObject: function(size, pos) {
var xm = this.newFace({tileWay:'T',widthSize:size.z,heightSize:size.y,textureSize:256,texture:"/img/3d/molds/basemetal.png"});
var ym = this.newFace({tileWay:'T',widthSize:size.x,heightSize:size.z,textureSize:256,texture:"/img/3d/molds/basemetal.png"});
var zm = this.newFace({tileWay:'T',widthSize:size.x,heightSize:size.y,textureSize:256,texture:"/img/3d/molds/basemetal.png"});
//var ym = this.newFace({widthSize:size.x,heightSize:size.z,texture:"/img/3d/molds/basemetal.png"});
//var zm = this.newFace({widthSize:size.x,heightSize:size.y,texture:"/img/3d/molds/basemetal.png"});
// var obj = new THREE.Mesh(new THREE.CubeGeometry(size.x,size.y,size.z),
// new THREE.MeshFaceMaterial(xm));
var obj = new THREE.Mesh(new THREE.CubeGeometry(size.x, size.y, size.z).clone(),
new THREE.MeshFaceMaterial(
[
xm, // +x
xm, // -x
ym, // +y
ym, // -y
zm, // +z
zm // -z
]));
obj.position.x = pos.x;
obj.position.y = pos.y;
obj.position.z = pos.z;
//obj.castShadow = true;
//obj.receiveShadow = true;
return obj;
},
newFace: function(cfg) {
var param = {};
if (cfg.texture) param.map = new THREE.TextureLoader().load(cfg.texture);
// if (cfg.widthSize) {
// param.map.wrapS = param.map.wrapT = THREE.RepeatWrapping;
// var walltileSize = 256;
// param.map.repeat.set(cfg.widthSize / walltileSize, cfg.heightSize / walltileSize);
// }
if (cfg.tileWay){
param.map.wrapS = param.map.wrapT = THREE.RepeatWrapping;
var walltileSize = cfg.textureSize;
if (cfg.tileWay == "H")
param.map.repeat.set( cfg.faceSize / walltileSize, 1);
if (cfg.tileWay == "T")
param.map.repeat.set( cfg.widthSize / walltileSize, cfg.heightSize / walltileSize);
if (cfg.tileWay == "V")
param.map.repeat.set(1, cfg.faceSize / walltileSize);
}
if (cfg.side) param.side = cfg.side;
if (cfg.color) param.color = new THREE.Color(cfg.color);
if (cfg.transparent) param.transparent = cfg.transparent;
var material = new THREE.MeshPhongMaterial(param);
if (cfg.opacity) {
material.opacity = cfg.opacity;
} else {
material.opacity = 1;
}
if (material.opacity !== 1) material.depthWrite = false;
param.needsUpdate = true;
//param.anisotropy = 16;
param.shading= THREE.SmoothShading;
//param.color = 0x222222;
param.shininess = 100;
param.envMap = reflectionCube;
//param.transparent = true;
//param.combine = THREE.MixOperation;
//param.reflectivity = 0.3;
param.refractionRatio = 0.5;
//param.envMap.mapping = new THREE.CubeReflectionMapping();
//return new THREE.MeshLambertMaterial(param);
return new THREE.MeshPhongMaterial(param);
//return material;
}
};