分享
查看: 2186|回复: 0

[分享] ThingJS室内3D定位导航技术,实现楼层切换定位

[复制链接]

ThingJS室内3D定位导航技术,实现楼层切换定位

发表于 2021-1-7 18:40:11 来自 分享 阅读模式 倒序浏览
zzv_icon2186 zzr_icon0 查看全部
#3D开发##3D模型#
  1. 单楼层导航定位
  2. 楼层切换导航路径
  3. 第一&第三人称视角

ThingJS室内3D定位导航技术,实现楼层切换定位

用户需要购买名牌香薰,又或者用餐时想吃泰国菜,在庞大、复杂又容易迷路的购物中心,并不是易事。国内购物中心内几乎都遍布了Wi-Fi热点,其实利用Wi-Fi热点进行室内定位和导航,在技术层面已经成熟。
物业管理考虑更多的是建筑、楼宇和设备管理,从而保障商家、用户的消防安全,这些都是背后看不见的成本。
  • 首先定位和导航,需要绘制室内地图。店铺外观和名字的修改过于频繁,所以需要进行管理,对模型外观进行修正。ThingJS提供场景搭建工具CampusBuilder,客户端免费下载,平台用户可以在3D场景内进行修改,轻松更新室内地图。
  • 其次是路径导航规划。需要解决的问题有:如何在3D场景下模拟不同的行走路径?如何解决楼层切换、动态提示等问题?如何在屏幕上一样进行流转定位?
我们来一一模拟室内导航的定位功能,ThingJS官网可以查看demo哟!

单楼层导航定位

(1)在一楼,鼠标单击选择导航的起点,绿色的地图导航标注就蹦了出来。

ThingJS室内3D定位导航技术,实现楼层切换定位


(2)接下来就可以选择导航终点,鼠标单击选择,注意的是,路径导航充分支持室内模式,包括大门、电梯和走廊,只要是允许通行的地方,都能够利用路径导航到达终点。
门、电梯等物体要设置相应属性,才可以响应导航功能,创建导航对象代码如下:
  1. /**
  2. * 创建导航对象
  3. */
  4. function createNavi() {
  5. if (navi == null) {
  6. navi = new Navigation({
  7. app: app, // 传入app对象
  8. followAngle: false, // 值为true是第一人称导航,为false是第三人称导航,默认为false
  9. // 导航点样式
  10. followAngleStyle: {
  11. speed: 5, // 导航点移动速度,默认为0.8
  12. tip: true, // 导航信息提示,默认为false
  13. element: 'naviTip' // 当打开导航信息提示时,需传入dom标签id显示导航信息
  14. },
  15. // 导航线样式
  16. lineStyle: {
  17. width: 0.3, // 线宽,默认为0.6
  18. image: '/guide/examples/images/navigation/line.png', // 贴图地址
  19. imageRepeat: [0.3, 1], // 贴图重复度,默认为[0.3, 1]
  20. scrollUV: true, // 启动 UV 动画,默认为true
  21. imageScrollSpeed: 0.5, // 设置 UV 动画播放速度,默认为0.5
  22. alwaysOnTop: false, // 设置导航线始终在最前端渲染显示,默认为false
  23. renderOrder: -1000 // 设置渲染排序值,默认为0
  24. }
  25. });
  26. }
  27. }
复制代码

楼层切换导航路径

室内导航同样支持单楼层和多楼层之间切换,实现上下楼的导航模式。通过模仿正常的通行路线,如穿越房间并登上电梯,走到指定的终点。
从开发角度来讲,不同楼层的电梯之间、房门之间要“打通”,即设置统一user ID,这样才会被识别为同样的物体。
  1. * 注册事件
  2. */
  3. function registerEvent() {
  4. // 单楼层与多楼层显示状态切换
  5. $('.floor-state').on('click', function () {
  6. if ($(this).hasClass('allLayers')) {
  7. $(this).removeClass('allLayers');
  8. $(this).find('.layer-img').attr('src', '/guide/examples/images/navigation/layer.png');
  9. let showFloor = $('.layer-floors .layer-floor.active span').text();
  10. building.floors.forEach(v => {
  11. if (v.name == showFloor) {
  12. v.visible = true;
  13. v.showAllRoofs(false);
  14. } else {
  15. v.visible = false;
  16. }
  17. });
  18. } else {
  19. $(this).addClass('allLayers');
  20. $(this).find('.layer-img').attr('src', '/guide/examples/images/navigation/layers.png');
  21. building.floors.forEach(v => {
  22. v.visible = true;
  23. v.showAllRoofs(false);
  24. });
  25. }
  26. });
  27. // 楼层切换按钮点击事件
  28. $('.layer-floors label.layer-floor').on('click', function () {
  29. if ($(this).hasClass('active')) {
  30. return;
  31. } else {
  32. $(this).siblings('.layer-floor').removeClass('active');
  33. $(this).addClass('active');
  34. let floorName = $(this).find('span').text();
  35. if ($('.floor-state.allLayers').length <= 0) {
  36. building.floors.forEach(v => {
  37. v.ceiling.visible = false;
  38. if (v.name == floorName) {
  39. v.visible = true;
  40. v.showAllRoofs(false);
  41. } else {
  42. v.visible = false;
  43. }
  44. });
  45. }
  46. app.camera.flyTo({
  47. object: app.query(floorName)[0],
  48. xAngle: 45,
  49. yAngle: 90,
  50. radiusFactor: 0.8,
  51. time: 1000,
  52. lerpType: null,
  53. complete: function () {
  54. }
  55. });
  56. }
  57. });
复制代码

ThingJS室内3D定位导航技术,实现楼层切换定位

第一人称和第三人称视角

ThingJS室内3D定位导航技术,实现楼层切换定位

如下图所示,第一人称导航提供路径引导,顶牌动态信息减少远程管理的操作障碍,不需要人工再操作,而这一点也区别于第三人称导航,后者是一个上帝视角,从第三方的角度来进行导航巡查。鼠标单击拖拽可以随意选择方向,不受限制,缺少身临其境的体验。

ThingJS室内3D定位导航技术,实现楼层切换定位

第一人称导航gif

ThingJS室内3D定位导航技术,实现楼层切换定位

第三人称导航gif
ThingJS让你开发3D交互场景更轻松!
avatar
游客~
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

130700ppkpl8x3t7tt1b1t