|
@@ -15,142 +15,6 @@ export default {
|
|
|
},
|
|
|
watch: {},
|
|
|
methods: {
|
|
|
- // 加载所有墙体模型
|
|
|
- // modelItem 变化后的
|
|
|
- // wallObj 变化前的
|
|
|
- drawModelOld(modelItem, spaceObj, wallObj, isAnimate=false){
|
|
|
- let cube = wallObj.obj;
|
|
|
- let that = this;
|
|
|
-
|
|
|
- // console.log("模型参数", wallPositionX, wallPositionY, wallScaleX, wallScaleY, lastWallPosition, wallDirection)
|
|
|
-
|
|
|
- console.log("墙体动画", modelItem, spaceObj, wallObj, isAnimate,spaceObj.rightCenter);
|
|
|
- if(!wallObj.obj){//新的逻辑
|
|
|
- //无变化则不需要启动动画
|
|
|
- if(modelItem.wallPositionX == wallObj.wallPositionX
|
|
|
- && modelItem.wallPositionY == wallObj.wallPositionY
|
|
|
- && modelItem.wallScaleX == wallObj.wallScaleX
|
|
|
- && modelItem.wallScaleY == wallObj.wallScaleY){
|
|
|
- return false;
|
|
|
- }
|
|
|
- wallObj.instancedMeshIndexList.forEach(item=>{
|
|
|
- let _index = item.instancedMeshIndex;
|
|
|
- let instancedMesh = this.instancedMeshList[_index];//获取网格实例
|
|
|
- let stratMatrix = new THREE.Matrix4();//定义一个四维矩阵
|
|
|
- let endMatrix = new THREE.Matrix4();//定义一个四维矩阵
|
|
|
- instancedMesh.getMatrixAt(item.instancedAtIndex,stratMatrix);//获取当前几何体的四维矩阵到stratMatrix里面
|
|
|
- let position = new THREE.Vector3();//当前几何体的位置参数
|
|
|
- let position1 = new THREE.Vector3();//计算后的位移参数
|
|
|
- let scale = new THREE.Vector3();//当前几何体的位置参数
|
|
|
- let scale1 = new THREE.Vector3();//计算后的形变参数
|
|
|
- let quaternion = new THREE.Quaternion();//四元数
|
|
|
- stratMatrix.decompose(position,quaternion,scale);//从当前几何体提取相关参数
|
|
|
- // 计算变化后的位置:位移后的位置 是 当前几何体的位置参数 加上 模型移动后的位置偏移量
|
|
|
- let x = position.x + modelItem.wallPositionX - wallObj.wallPositionX;
|
|
|
- let z = position.z + modelItem.wallPositionY - wallObj.wallPositionY;
|
|
|
- // 计算变化后的缩放:缩放后的值 是 当前几何体的缩放比例 同步 模型缩放后缩放比例
|
|
|
- let scalex = scale.x * (modelItem.wallScaleX/ wallObj.wallScaleX);
|
|
|
- let scaley = scale.z * (modelItem.wallScaleY/ wallObj.wallScaleY);
|
|
|
- //x轴放大,则需要移动多一倍的距离
|
|
|
- if(modelItem.wallScaleX!=wallObj.wallScaleX){
|
|
|
- if(modelItem.wallRotateY>0){//说明旋转了
|
|
|
- let _ch = modelItem.wallPositionY - wallObj.wallPositionY;
|
|
|
- if(spaceObj.rightCenter){//即形变几何体是右侧不变,由于中心点在左侧,所以要再加一倍变化的值
|
|
|
- z = z + _ch;
|
|
|
- }else{//形变几何体是左侧不变,由于中心点在左侧,所以要减去变化的值
|
|
|
- z = z - _ch;
|
|
|
- }
|
|
|
- // z = z + modelItem.wallPositionY - wallObj.wallPositionY
|
|
|
- }else{
|
|
|
- let _ch = modelItem.wallPositionX - wallObj.wallPositionX;
|
|
|
- if(spaceObj.rightCenter){
|
|
|
- x = x + _ch;
|
|
|
- }else{
|
|
|
- x = x - _ch;
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
- //Y轴缩小(这里理解是Z轴,映射原因),则需要移动多一倍的距离
|
|
|
- //因为几何体的操作原点是左边中心点,不是几何中心点 所以计算的时候需要在多移动一倍
|
|
|
- if(modelItem.wallScaleY!=wallObj.wallScaleY){
|
|
|
- if(modelItem.wallRotateY>0){//说明旋转了
|
|
|
- let _ch = modelItem.wallPositionX - wallObj.wallPositionX;
|
|
|
- if(spaceObj.rightCenter){
|
|
|
- x = x + _ch;
|
|
|
- }else{
|
|
|
- x = x - _ch;
|
|
|
- }
|
|
|
- // x = x + modelItem.wallPositionX - wallObj.wallPositionX;
|
|
|
- }else{
|
|
|
- let _ch = modelItem.wallPositionY - wallObj.wallPositionY;
|
|
|
- if(spaceObj.rightCenter){
|
|
|
- z = z + _ch;
|
|
|
- }else{
|
|
|
- z = z - _ch;
|
|
|
- }
|
|
|
- // z = z + modelItem.wallPositionY - wallObj.wallPositionY
|
|
|
- }
|
|
|
- }
|
|
|
- position1.set(x, position.y, z);
|
|
|
- scale1.set(scalex,scale.y,scaley);
|
|
|
- //获取最终的几何体四维变化矩阵
|
|
|
- endMatrix = endMatrix.compose(position1,quaternion,scale1);
|
|
|
- // console.warn("***drawModel-isAnimate0***",JSON.stringify(position),JSON.stringify(scale),wallObj.name,modelItem,wallObj);
|
|
|
- // console.warn(JSON.stringify(stratMatrix.elements),JSON.stringify(endMatrix.elements));
|
|
|
- // instancedMesh.instanceMatrix.needsUpdate = true;
|
|
|
- // instancedMesh.setMatrixAt(item.instancedAtIndex,endMatrix);//更新几何体的世界矩阵
|
|
|
- var tween = new TWEEN.Tween(stratMatrix.elements)
|
|
|
- .to(endMatrix.elements, 2000)
|
|
|
- .easing(TWEEN.Easing.Quadratic.InOut)
|
|
|
- .onUpdate((matrixWorld)=> {
|
|
|
- let m4 = new THREE.Matrix4();//定义一个四维矩阵
|
|
|
- m4.set(...matrixWorld);//注意:四维矩阵的显示和实际计算的行列优先规则不同
|
|
|
- instancedMesh.instanceMatrix.needsUpdate = true;//更新之前,必须开启开关
|
|
|
- instancedMesh.setMatrixAt(item.instancedAtIndex,m4.transpose());//更新几何体的世界矩阵
|
|
|
- }).onComplete(()=>{
|
|
|
- instancedMesh.setMatrixAt(item.instancedAtIndex,endMatrix);//更新几何体的世界矩阵
|
|
|
- this.tweenCameraAnmaChange(false)
|
|
|
- });
|
|
|
- // 开始动画
|
|
|
- tween.start();
|
|
|
- this.tweenCameraAnmaChange(true)
|
|
|
- })
|
|
|
- //更新模型的最新位置,确保计算结果正确
|
|
|
- setTimeout(()=>{
|
|
|
- let gltfWall = that.gltfWalls.find(gltfWall=>gltfWall.uniId==wallObj.uniId);//判断是否已经添加过
|
|
|
- gltfWall.wallPositionX = modelItem.wallPositionX;
|
|
|
- gltfWall.wallPositionY = modelItem.wallPositionY;
|
|
|
- gltfWall.wallScaleX = modelItem.wallScaleX;
|
|
|
- gltfWall.wallScaleY = modelItem.wallScaleY;
|
|
|
- gltfWall.wallRotateY = modelItem.wallRotateY;
|
|
|
- }, 2000);
|
|
|
- }else{
|
|
|
- console.warn("***drawModel-isAnimate-2***",JSON.stringify(cube.position),JSON.stringify(cube.scale),modelItem);
|
|
|
- var tween = new TWEEN.Tween({
|
|
|
- x: cube.position.x,
|
|
|
- z: cube.position.z,
|
|
|
- sx:cube.scale.x,
|
|
|
- sz:cube.scale.z
|
|
|
- })
|
|
|
- .to({
|
|
|
- x: modelItem.wallPositionX,
|
|
|
- z: modelItem.wallPositionY,
|
|
|
- sx:modelItem.wallScaleX
|
|
|
- }, 2000)
|
|
|
- .easing(TWEEN.Easing.Quadratic.InOut)
|
|
|
- .onUpdate((object)=> {
|
|
|
- cube.position.x = object.x;
|
|
|
- cube.position.z = object.z;
|
|
|
- cube.scale.x = object.sx;
|
|
|
- cube.scale.z = object.sz;
|
|
|
- }).onComplete(()=>{
|
|
|
- this.tweenCameraAnmaChange(false)
|
|
|
- });
|
|
|
- // 开始动画
|
|
|
- tween.start();
|
|
|
- this.tweenCameraAnmaChange(true)
|
|
|
- }
|
|
|
- },
|
|
|
// modelItem 变化后的
|
|
|
// wallObj 变化前的-一面墙下的某一段墙体
|
|
|
drawModel(modelItem, spaceObj, wallObj, isAnimate=false){
|