|
@@ -30,7 +30,8 @@ export default {
|
|
|
let comlist = list.filter(it=>it.spaceType!=14);//过滤花园的空间
|
|
|
this.loaderCommonSpace(this.gltfSpaceUrl,comlist,1);
|
|
|
let arrlist = list.filter(it=>it.spaceType==14);//花园的空间
|
|
|
- this.loaderCommonSpace(this.gltfSpace1Url,arrlist,2);
|
|
|
+ // this.loaderCommonSpace(this.gltfSpace1Url,arrlist,2);
|
|
|
+ this.loaderGraseSpace(list);//加载草地的模型-所有地块都添加,填补房间里面的
|
|
|
},
|
|
|
loaderCommonSpace(gltfSpaceUrl,list,type=1){
|
|
|
var that = this;
|
|
@@ -117,6 +118,55 @@ export default {
|
|
|
}
|
|
|
});
|
|
|
},
|
|
|
+ //草地加载
|
|
|
+ loaderGraseSpace(list){
|
|
|
+ let glbWidth = 300;
|
|
|
+ let glbHeight = 300;
|
|
|
+ var that = this;
|
|
|
+ console.log("草地模型加载成功",list)
|
|
|
+ //将模型添加到场景中
|
|
|
+ // let texture = new THREE.TextureLoader().load( "https://dm.static.elab-plus.com/miniProgram/T_GLTF_MI_Uncut_Grass_oilpt20_2K_BaseColor.jpg");
|
|
|
+ // let texture = new THREE.TextureLoader().load( "https://dm.static.elab-plus.com/miniProgram/Avatar_male.png" );
|
|
|
+ // texture.wrapS = THREE.RepeatWrapping;
|
|
|
+ // texture.wrapT = THREE.RepeatWrapping;
|
|
|
+
|
|
|
+ list && list.forEach(obj=>{
|
|
|
+ let positionX = obj.centerX / 100;
|
|
|
+ let positionY = obj.centerY / 100;
|
|
|
+ let scaleX = obj.spaceWidth / 100;
|
|
|
+ let scaleY = obj.spaceHeight / 100;
|
|
|
+
|
|
|
+ let texture = new THREE.TextureLoader().load( "https://dm.static.elab-plus.com/miniProgram/grass.jpg");
|
|
|
+ texture.wrapS = THREE.RepeatWrapping;
|
|
|
+ texture.wrapT = THREE.RepeatWrapping;
|
|
|
+ //使用纹理贴图材质
|
|
|
+ texture.repeat.set(scaleX, scaleY);
|
|
|
+
|
|
|
+ let geometry = new THREE.PlaneGeometry(obj.spaceWidth/100, obj.spaceHeight/100);
|
|
|
+ let material = new THREE.MeshBasicMaterial({ map: texture });
|
|
|
+ let cube = new THREE.Mesh(geometry, material);
|
|
|
+
|
|
|
+ cube.name= "地板";
|
|
|
+ cube.userType = "mesh";
|
|
|
+ cube.userData = obj;//位置数据
|
|
|
+ // 设置位置,旋转,缩放
|
|
|
+ cube.position.set(positionX, -0.001, -positionY);
|
|
|
+ cube.rotation.x = -Math.PI / 2 ; // 旋转 180 度
|
|
|
+ cube.receiveShadow = true;//材质是否接收阴影
|
|
|
+
|
|
|
+ //注释掉,不让草地进入空间列表中,不触发空间变化的动画过程,规避掉动画过程中的问题
|
|
|
+ // let md = {
|
|
|
+ // spaceId:obj.spaceId,//模型实例的唯一标识
|
|
|
+ // spaceName:obj.spaceName,//几何体的id
|
|
|
+ // spaceType:obj.spaceType,
|
|
|
+ // position:cube.position,
|
|
|
+ // scale:cube.scale,
|
|
|
+ // isSizeLock:obj.isSizeLock,
|
|
|
+ // };
|
|
|
+ // that.gltfSpaces.push(md);
|
|
|
+ that.scene.add(cube);
|
|
|
+ })
|
|
|
+ },
|
|
|
//修改当前空间的面积大小
|
|
|
changeSpacesAnimOld(curSpace){
|
|
|
// 寻找地板
|
|
@@ -178,76 +228,100 @@ export default {
|
|
|
let toPz = curSpace.toPz;
|
|
|
let toScaleX = curSpace.toScaleX;
|
|
|
let toScaleZ = curSpace.toScaleZ;
|
|
|
-
|
|
|
- let spaceInitMatrix = [];//空间动画时的初始变换矩阵
|
|
|
- cube.instancedMeshIndexList.forEach(instanced=>{
|
|
|
- let _index = instanced.instancedMeshIndex;//geometry实例 在 全局InstancedMesh实例的位置
|
|
|
- let instancedMesh = this.instancedSpaceMeshList[_index];//获取具体的网格实例
|
|
|
- let startMatrix = new THREE.Matrix4();//定义一个四维矩阵
|
|
|
- instancedMesh.getMatrixAt(instanced.instancedAtIndex,startMatrix);//获取当前几何体的四维矩阵到stratMatrix里面
|
|
|
- spaceInitMatrix.push({
|
|
|
- index:_index,
|
|
|
- matrix:startMatrix.clone(),
|
|
|
- color:instancedMesh.material.color.clone(),
|
|
|
- })
|
|
|
- });
|
|
|
- // console.warn("***cube***",cube.spaceId,Date.now(),JSON.stringify(spaceInitMatrix[0].matrix))
|
|
|
- var tween = new TWEEN.Tween({
|
|
|
- x: cube.position.x,
|
|
|
- z: cube.position.z,
|
|
|
- sx:cube.scale.x,
|
|
|
- sz:cube.scale.z
|
|
|
- })
|
|
|
- .to({
|
|
|
- x: curSpace.toPx,
|
|
|
- z: curSpace.toPz,
|
|
|
- sx:curSpace.toScaleX,
|
|
|
- sz:curSpace.toScaleZ
|
|
|
- }, 2000)
|
|
|
- .easing(TWEEN.Easing.Quadratic.InOut)
|
|
|
- .onUpdate((object)=> {
|
|
|
- //获取地板模型的geometry实例
|
|
|
+ if(cube.instancedMeshIndexList){
|
|
|
+ let spaceInitMatrix = [];//空间动画时的初始变换矩阵
|
|
|
cube.instancedMeshIndexList.forEach(instanced=>{
|
|
|
- let _index = instanced.instancedMeshIndex;//第一个geometry实例 在 全局InstancedMesh实例的位置
|
|
|
+ let _index = instanced.instancedMeshIndex;//geometry实例 在 全局InstancedMesh实例的位置
|
|
|
let instancedMesh = this.instancedSpaceMeshList[_index];//获取具体的网格实例
|
|
|
- //获取对象实例的初始变换矩阵
|
|
|
- let tmp = spaceInitMatrix.find(it=>it.index==_index);
|
|
|
- let stratMatrix = tmp.matrix.clone(); //获取初始变换矩阵
|
|
|
- let scaleMatrix = new THREE.Matrix4(); //定义一个缩放变化矩阵
|
|
|
- let panMatrix = new THREE.Matrix4(); //定义一个平移变化矩阵
|
|
|
-
|
|
|
- scaleMatrix.makeScale(object.sx / scaleX,1,object.sz / scaleZ); //获得缩放变化矩阵
|
|
|
- panMatrix.makeTranslation(object.x - x,0,object.z - z); //获得平移变化矩阵
|
|
|
- stratMatrix.multiply(scaleMatrix).premultiply(panMatrix);//通过矩阵计算获得最终的形变矩阵
|
|
|
- instancedMesh.instanceMatrix.needsUpdate = true;//更新之前,必须开启开关
|
|
|
- instancedMesh.setMatrixAt(instanced.instancedAtIndex,stratMatrix);//更新几何体的世界矩阵
|
|
|
- if(this.curSpaceObj.spaceId==cube.spaceId){//当前选中的空间才变化颜色
|
|
|
- instancedMesh.instanceColor.needsUpdate = true;//打开颜色修改开关,不开,颜色是不能修改额
|
|
|
- let color = new THREE.Color(0xFF9F40); // 使用sRGB颜色值
|
|
|
- // color.convertSRGBToLinear(); // 将颜色值转换为线性颜色值
|
|
|
- instancedMesh.setColorAt(instanced.instancedAtIndex, color);//修改这个几何体的颜色
|
|
|
- }
|
|
|
+ let startMatrix = new THREE.Matrix4();//定义一个四维矩阵
|
|
|
+ instancedMesh.getMatrixAt(instanced.instancedAtIndex,startMatrix);//获取当前几何体的四维矩阵到stratMatrix里面
|
|
|
+ spaceInitMatrix.push({
|
|
|
+ index:_index,
|
|
|
+ matrix:startMatrix.clone(),
|
|
|
+ color:instancedMesh.material.color.clone(),
|
|
|
+ })
|
|
|
});
|
|
|
- }).onComplete(()=>{//这个回调很可能会很慢
|
|
|
- this.tweenCameraAnmaChange(false);
|
|
|
- console.warn("***changeSpacesAnim-over***")
|
|
|
- if(this.curSpaceObj.spaceId==cube.spaceId){//当前选中的空间才恢复颜色
|
|
|
+ // console.warn("***cube***",cube.spaceId,Date.now(),JSON.stringify(spaceInitMatrix[0].matrix))
|
|
|
+ var tween = new TWEEN.Tween({
|
|
|
+ x: cube.position.x,
|
|
|
+ z: cube.position.z,
|
|
|
+ sx:cube.scale.x,
|
|
|
+ sz:cube.scale.z
|
|
|
+ })
|
|
|
+ .to({
|
|
|
+ x: curSpace.toPx,
|
|
|
+ z: curSpace.toPz,
|
|
|
+ sx:curSpace.toScaleX,
|
|
|
+ sz:curSpace.toScaleZ
|
|
|
+ }, 2000)
|
|
|
+ .easing(TWEEN.Easing.Quadratic.InOut)
|
|
|
+ .onUpdate((object)=> {
|
|
|
+ //获取地板模型的geometry实例
|
|
|
cube.instancedMeshIndexList.forEach(instanced=>{
|
|
|
- let _index = instanced.instancedMeshIndex;//第一个geometry实例 在 全局Instance
|
|
|
+ let _index = instanced.instancedMeshIndex;//第一个geometry实例 在 全局InstancedMesh实例的位置
|
|
|
let instancedMesh = this.instancedSpaceMeshList[_index];//获取具体的网格实例
|
|
|
+ //获取对象实例的初始变换矩阵
|
|
|
let tmp = spaceInitMatrix.find(it=>it.index==_index);
|
|
|
- instancedMesh.instanceColor.needsUpdate = true;//打开颜色修改开关,不开,颜色是不能修改额
|
|
|
- instancedMesh.setColorAt(instanced.instancedAtIndex, tmp.color);//修改这个几何体的颜色
|
|
|
+ let stratMatrix = tmp.matrix.clone(); //获取初始变换矩阵
|
|
|
+ let scaleMatrix = new THREE.Matrix4(); //定义一个缩放变化矩阵
|
|
|
+ let panMatrix = new THREE.Matrix4(); //定义一个平移变化矩阵
|
|
|
+
|
|
|
+ scaleMatrix.makeScale(object.sx / scaleX,1,object.sz / scaleZ); //获得缩放变化矩阵
|
|
|
+ panMatrix.makeTranslation(object.x - x,0,object.z - z); //获得平移变化矩阵
|
|
|
+ stratMatrix.multiply(scaleMatrix).premultiply(panMatrix);//通过矩阵计算获得最终的形变矩阵
|
|
|
+ instancedMesh.instanceMatrix.needsUpdate = true;//更新之前,必须开启开关
|
|
|
+ instancedMesh.setMatrixAt(instanced.instancedAtIndex,stratMatrix);//更新几何体的世界矩阵
|
|
|
+ if(this.curSpaceObj.spaceId==cube.spaceId){//当前选中的空间才变化颜色
|
|
|
+ instancedMesh.instanceColor.needsUpdate = true;//打开颜色修改开关,不开,颜色是不能修改额
|
|
|
+ let color = new THREE.Color(0xFF9F40); // 使用sRGB颜色值
|
|
|
+ // color.convertSRGBToLinear(); // 将颜色值转换为线性颜色值
|
|
|
+ instancedMesh.setColorAt(instanced.instancedAtIndex, color);//修改这个几何体的颜色
|
|
|
+ }
|
|
|
});
|
|
|
- }
|
|
|
- });
|
|
|
- // 开始动画
|
|
|
- tween.start();
|
|
|
- this.tweenCameraAnmaChange(true)
|
|
|
- cube.position.x = curSpace.toPx;
|
|
|
- cube.position.z = curSpace.toPz;
|
|
|
- cube.scale.x = curSpace.toScaleX;
|
|
|
- cube.scale.z = curSpace.toScaleZ;
|
|
|
+ }).onComplete(()=>{//这个回调很可能会很慢
|
|
|
+ this.tweenCameraAnmaChange(false);
|
|
|
+ console.warn("***changeSpacesAnim-over***")
|
|
|
+ if(this.curSpaceObj.spaceId==cube.spaceId){//当前选中的空间才恢复颜色
|
|
|
+ cube.instancedMeshIndexList.forEach(instanced=>{
|
|
|
+ let _index = instanced.instancedMeshIndex;//第一个geometry实例 在 全局Instance
|
|
|
+ let instancedMesh = this.instancedSpaceMeshList[_index];//获取具体的网格实例
|
|
|
+ let tmp = spaceInitMatrix.find(it=>it.index==_index);
|
|
|
+ instancedMesh.instanceColor.needsUpdate = true;//打开颜色修改开关,不开,颜色是不能修改额
|
|
|
+ instancedMesh.setColorAt(instanced.instancedAtIndex, tmp.color);//修改这个几何体的颜色
|
|
|
+ });
|
|
|
+ }
|
|
|
+ });
|
|
|
+ // 开始动画
|
|
|
+ tween.start();
|
|
|
+ this.tweenCameraAnmaChange(true)
|
|
|
+ cube.position.x = curSpace.toPx;
|
|
|
+ cube.position.z = curSpace.toPz;
|
|
|
+ cube.scale.x = curSpace.toScaleX;
|
|
|
+ cube.scale.z = curSpace.toScaleZ;
|
|
|
+ }else{//有点问题规避下
|
|
|
+ // 空间动画
|
|
|
+ var tween = new TWEEN.Tween({
|
|
|
+ x: scaleX,
|
|
|
+ z: scaleZ,
|
|
|
+ px:x,
|
|
|
+ pz:z,
|
|
|
+ })
|
|
|
+ .to({
|
|
|
+ x: toScaleX,
|
|
|
+ z: toScaleZ,
|
|
|
+ px:toPx,
|
|
|
+ pz:toPz,
|
|
|
+ }, 2000)
|
|
|
+ .easing(TWEEN.Easing.Quadratic.InOut)
|
|
|
+ .onUpdate((object)=> {
|
|
|
+ cube.scale.x = object.x;
|
|
|
+ cube.scale.z = object.z;
|
|
|
+ cube.position.x = object.px;
|
|
|
+ cube.position.z = object.pz;
|
|
|
+ });
|
|
|
+ // 开始动画
|
|
|
+ tween.start();
|
|
|
+ }
|
|
|
},
|
|
|
//所有空间整体缩放-同时同步到数据里面
|
|
|
allSpaceScale(){
|