该博文主要展现本人采用 ht for web 提供的可视化技术,对智慧房产、智慧物业相关方向的可视化呈现作的一点尝试。web
但愿该案例能在 web3d 和数据可视化大行其道的当下为你们拓宽思路,提供一些关于室内场景呈现的灵感。布局
连接地址:http://www.hightopo.com/demo/estate/动画
1.智慧物业,针对小区物业管理、住户平常产生的水电气费用的检测等提供可视化解决方案。this
2.商品房销售可在大屏上对室内布局、各类户型进行展现,给购房客户展现各个户型的精装修效果,更能够无缝对接VR。spa
3.针对蛋壳、58同城、优客逸家等租房平台,在PC端和移动端进行3D实景展现,让租客们能够足不出户就了解到各个房源的布局和设备设施,以及其余租户的用户满意度。设计
1 if (data.getAnimation()) { 2 return data.getAnimation(); 3 } else { 4 return { 5 narrow: { 6 from: 0.012*5*3, 7 to: 0.01*5*3, 8 duration: 250, 9 easing: 'Linear', 10 next: 'setPositionBack', 11 onUpdate: function (value) { 12 this.setSize3d(value, (0.012*5*3-value+(0.01*5*3)), value); 13 }, 14 onComplete: () => { 15 //... 16 } 17 }, 18 setPositionBack: { 19 //... 20 }, 21 allFloorsMove: { 22 //... 23 }, 24 setPositionForward: { 25 //... 26 }, 27 expand: { 28 from: 0.01*5*3, 29 to: 0.012*5*3, 30 duration: 250, 31 easing: 'Linear', 32 onUpdate: value => { 33 this.currentSelectedFloor.setSize3d(value, (0.012*5*3-(value-(0.01*5*3))), value); 34 }, 35 onComplete: () => { 36 this.openLightOrNot(true); 37 this.animationControl(1, false); 38 this.changeFloorText(); 39 } 40 }, 41 start: ['narrow'] 42 } 43 }
换层动画设计成 5 个阶段:3d
1.当前楼层收缩成正常大小code
2.完成后经过设置的 next 进入后退动画对象
3.待当前楼层退回到主轴后,全楼层共同平移blog
4. 平移到目标高度后,触发楼层前移
5.前移完毕再进行变大变矮的动画
该动画采用重写 ht.DataModel 的 getDataAnimation() 方法,对拥有动画须要的三角体和楼层对象(ht.Node)进行动画匹配,在第一只执行时返回包含动画逻辑的Anim,
此后以每 50 毫秒 (3帧左右一次)的频率执行动画,
this.dm3d.enableAnimation(50);
因为可点选的三角体处于持续上下移动和绕自身旋转的动画中,故 3D 动画不会中止,无需调用 disableAnimation 方法,此时就须要特别注意动画执行间隔和多个动画阶段中 duration 的搭配,谨防内存泄漏。
三角体动画设置很少赘述:
1 if (this.animationFlags.triangle3dAnimation) { 2 if (data.getAnimation()) { 3 return data.getAnimation(); 4 } else { 5 return { 6 up: { 7 from: 90, 8 to: 130, 9 next: "down", 10 duration: 1500, 11 easing: 'Linear', 12 onUpdate: function (value) { 13 this.setPosition3d(this.getPosition3d()[0], value, this.getPosition3d()[2]); 14 } 15 }, 16 down: { 17 from: 130, 18 to: 90, 19 duration: 1500, 20 easing: 'Linear', 21 onUpdate: function (value) { 22 this.setPosition3d(this.getPosition3d()[0], value, this.getPosition3d()[2]); 23 } 24 }, 25 rotate: { 26 from: 0, 27 to: 360, 28 duration: 3000, 29 easing: 'Linear', 30 onUpdate: function (value) { 31 this.setRotationY(value * Math.PI / 180); 32 } 33 }, 34 start: ['up', 'rotate'] 35 } 36 } 37 }
效果展现:
按钮和楼层动画能够相互触发,楼层按钮动画分为两种类型
1.纵向平移,同楼层动画
1 translate: { 2 from: 0, 3 to: this.distanceToMoveButton, 4 duration: 1250, 5 easing: 'Linear', 6 onUpdate: value => { 7 const list = this.dm2d.getDatas(); 8 list.each(item => { 9 if (/^button/.test(item.getTag())) { 10 const yPos = this.buttonsCurrentYPos[item.a('buttonNum')] + value; 11 item.setPosition(item.getPosition()['x'], yPos); 12 } 13 }); 14 }, 15 }
2.根据是不是当前层进行放大缩小,缩放的逻辑稍微有些绕脑,主要分为两类
a.只放大,只缩小
b.会跨越中间层,如当前层为F1,点击F4就会出现F2先放大再缩小的状况。
本人将缩放动画分为10类型
start: ['translate', 'scaleBM', 'scaleBL', 'scaleMB', 'scaleMM', 'scaleML', 'scaleML2', 'scaleLB', 'scaleLM', 'scaleLM2', 'scaleLL']
其中, middle to little / little to middle / little to little 这三种状况会出现跨中间行,即先大后小的动画
设置 2D 楼层按钮动画须要用到的四个关键方法:
1 /** 2 * 获取缩放动画类型 3 */ 4 getScaleTypeForButton(currentSize, nextSize, turn) { 5 //... 6 } 7 8 /** 9 * 设置 button 的缩放类型 10 */ 11 setScaleTypeToButton(selectedFloor) { 12 //... 13 } 14 15 /** 16 * 计算 button 须要移动的距离 17 * @param {ht.Data} selectedFloor - 选中的楼层 18 * @param {ht.Data} selectedFloorBefore - 以前选中的楼层 19 */ 20 countDistanceToMoveButton(selectedFloor, selectedFloorBefore) { 21 //... 22 } 23 24 /** 25 * 更新各个 button 所在高度 26 */ 27 refreshButtonsCurrentYPos() { 28 //... 29 }
效果展现:
该 demo 主要涉及到两种处 2d 与 3d 交互:
1.按钮与楼层之间的相互触发。
设置一个控制器:
1 /** 2 * 动画控制器 3 * @param {Number} animateNum - 动画编号 4 * @param {Boolean} flag - 开启或关闭 5 */ 6 animationControl(animateNum, flag) { 7 //... 8 }
2.点选三角体,右侧信息栏对应租户信息出现边框
简单说来就是 2D 3D 经过 tag 联系, 改变 style 中边框大小来高亮选中项
1 switch (tag) { 2 case 'triangle0': 3 this.dm2d.getDataByTag('rightRect1').s('shape.border.width', 3); 4 break; 5 //... 6 } 7 //... 8 // 清空 9 this.dm2d.getDataByTag('rightRect1').s('shape.border.width', 0);
效果展现:
任何疑问或建议欢迎留言讨论。