feng 发布的文章

通过纹理的2维坐标点定位球形贴图对应所在位置

最近有一个需求,希望能在全景图的贴图上直接选择位置放置物体,最后反应在全景图的相应位置点.在这里记录一下开发代码:

全景球体创建

      let path = this.publicPath + 'texture/uv_grid_opengl.jpg'

      let texture = new THREE.TextureLoader().load(path)
      let material = new THREE.MeshBasicMaterial({
        map: texture,
        side: THREE.DoubleSide // 也可以是单面
      })

      let geometry = new THREE.SphereBufferGeometry(510, 40, 40) // 半径 ,宽高分割数.可以随意
      geometry.scale(-1, 1, 1) // 让贴图在内部贴,而不是外部.

      this.$mesh = new THREE.Mesh(geometry, material)

图片上选点

通过图片相对位置计算出在全景球体的相对坐标

参考代码:https://threejsfundamentals.org/threejs/lessons/threejs-align-html-elements-to-3d.html

      // x,y 的0点位置从左上角来算的,反应在图片上的长宽比值.
      // 因为geometry的x坐标返了,所以真也要相反处理
      let lat = (e.y - 0.5) * 180
      let lon = (1 - e.x) * 360

      const lonFudge = -Math.PI * 0.5 // Math.PI
      const latFudge = Math.PI
      // these helpers will make it easy to position the boxes
      // We can rotate the lon helper on its Y axis to the longitude
      const lonHelper = new THREE.Object3D()
      // We rotate the latHelper on its X axis to the latitude
      const latHelper = new THREE.Object3D()
      lonHelper.add(latHelper)
      // The position helper moves the object to the edge of the sphere
      const positionHelper = new THREE.Object3D()
      positionHelper.position.z = 500
      latHelper.add(positionHelper)

      // adjust the helpers to point to the latitude and longitude
      lonHelper.rotation.y = THREE.MathUtils.degToRad(lon) + lonFudge
      latHelper.rotation.x = THREE.MathUtils.degToRad(lat) + latFudge

      // get the position of the lat/lon
      positionHelper.updateWorldMatrix(true, false)
      const position = new THREE.Vector3()
      positionHelper.getWorldPosition(position)

      // 最终x,y点反应在球形位置上.
      let pos = [position.x, position.y, position.z]

全景图上效果

小程序集成trtc-room 提示 is not defined

最近做了一个实时音视频小程序,用了微信的实时音视频服务,将demo中的trtc-room搬过来后直接提示
Error: module "static/component/trtc-room/trtc-room.js" is not defined

最终原因是没有在本地设置中设置将ES6转ES5,因为本身程序是用mpvue开发的,其他都不需要转,所以没有考虑到这方面的原因,查了一个晚上,特此记录,给自己长个记性....

通过外网访问openwrt管理路由器后台

有时候我们想在公司上班的时候访问一下家里路由器的后台(好多原因拉,比方说下载电影等等等等...)

因为平时确实有这方面的需求存在,查了一下资料,比方说可以通过搭建rpc服务器做内网穿透等等...很开心,本人是电信的宽带,IP是外网IP,正好我自己有好多个域名,可以通过域名商开放的api接口实现dns动态绑定IP.

本人是腾讯云的域名服务商,但是腾讯云的域名开放api网上资料有点少,偶然间发现腾讯云原来就是dnspod域名商.dnspod的域名商接口简单不少,关键是每个接口都有curl的调用示例,非常的方便.附上两个dnspod的api链接:
dnspod Token申请 https://support.dnspod.cn/Kb/showarticle/tsid/227/
dnspod 域名记录修改api https://www.dnspod.cn/docs/records.html#record-modify

连curl的示例都有真的是太简单了,需要做的就是写个shell脚本定时跑就完了.

接下来就是openwrt设置防火墙让外部的访问可以访问到路由器后台:

防火墙基本设置 , 主要是都改成接收,

防火墙基本设置

端口转发 , 外部的80端口被服务商封了,需要用其他端口转发到内部的80端口

防火墙端口转发

恩...到了最后,我又发现了openwrt其实有一个ddns的管理工具,就是帮你把定时更新dns解析的脚本也做好了,叫koolddns ^_^

楼层设备点编辑

项目有需求要将对接过来的设备展示在3d建筑模型内,就涉及到一个后台操作保存设备点的位置的功能.
基于three.js源码中的editor的二次开发,基本实现了想要的需求

github源码地址

demo展示地址

界面展示

界面初始化展示

大概流程为初始化化时加载建筑后显示某一层楼建筑,并且加载设备列表,点击设备列表可添加到楼层场景当中进行调整位置,大小,方向.
设备编辑状态展示

该demo未完成部分为初始化时向后台请求获取楼层列表以及当前楼层下的设备列表,还有点击保存按钮后提交到后台数据库中去等涉及到和后台接口联调的部分.

使threejs中的2d dom元素能够不影响轨道控制器使用

很多时候为了方便,我们会在3d环境中放置dom元素.这样的好处有很多,这里不多说明.
2d元素如何放到3d环境中可以参考
threejs-align-html-elements-to-3d.html

根据上面介绍我自己写了一个基类方便使用
https://github.com/aoobao/bim_test/blob/master/src/assets/js/BaseElement.js

接着碰到一个问题是: 我们希望鼠标在这些dom上时threejs中的轨道控制器的事件也能够响应,一开始找了半天没发现是什么地方阻止了事件传递,突然发现了大部分情况下我们是创建轨道控制器的时候,domelement是传递renderer.domElement的(就是canvas元素),而dom不会放在canvas内部
在这里只要把事件绑定在跟canvas一样大的父元素上,那些2d dom都放在父元素中就可以了.

// var orbitControls = new CameraControls(camera, renderer.domElement)

var orbitControls = new CameraControls(camera, container) // container 为和canvas一样大小的父节点,包裹其余2d元素