在ThingJS在线开发里,是提供了一个指南针控件的,如下图  
 
 
 实际预览效果如下图 
 
 也能看,找两张好看的图片放上去也能用,但是这个没有任何事件,相当于能看,不能扩展,既然如此,那我们就写一个定义的指南针。 首先要明白指南针的原理,一般指南针用于地图,用来指向北极(或南极)的方向。但是在3D空间里没有南极、北极一说。通常用当前摄像机看的方向与空间向量(0,0,-1)取夹角,得出来的角度就是指针需要旋转的角度。  
- 创建一个2D页面用于指示,代码如下。
 
- $('#div2d').append(
 
 - `<div id="compass" style="position:absolute;left: 20px; top: 100px; width: 100px; height:100px">
 
 - <div style="background:url('https://www.thingjs.com/static/images/compass.png');background-repeat: repeat;position: absolute;left: 0;width: 100%;height: 100%;background-size: contain;"></div>
 
 - </div>`)
 
  复制代码 
 - 获取摄像机与空间向量(0,0,-1)的夹角。
 
- -app.renderCamera.rotation.z
 
  复制代码 
 - 注册摄像机视角改变事件,当摄像机视角改变的时候,更新图片旋转角度。
 
- // 注册摄像机视角改变事件,更新指南针图片朝向
 
 - app.on(THING.EventType.CameraChange, function () {
 
 -     $('#compass div').css('transform', 'rotateZ(10deg)')
 
 -         });
 
  复制代码 
 - 此时,一个新的指南针空间就做好了,指南针也是一个2D页面,可对其进行样式控制、添加事件。完整代码如下。
 
- class Compass {
 
 -     constructor(param) {
 
 -         if (!param || !param.app) {
 
 -             return Object.create(null);
 
 -         }
 
 -         this.init(param);
 
 -     }
 
 -     init(param) {
 
 -         this.app = param.app;
 
 -         // 创建2D页面
 
 -         $('#div2d').append(
 
 -         `<div id="compass" style="position:absolute;left: 20px; top: 100px; width: 100px; height:100px">
 
 -         <div style="background:url('https://www.thingjs.com/static/images/compass.png');background-repeat: repeat;position: absolute;left: 0;width: 100%;height: 100%;background-size: contain;"></div>
 
 -         </div>`)
 
 -         var _this = this;
 
 -         // 点击图片复原
 
 -         $('#compass').on('click', function () {
 
 -             // 摄像机旋转角度复位
 
 -             _this.app.camera.rotateAround({
 
 -                 target: _this.app.camera.target,
 
 -                 yRotateAngle: _this.getRotation() / Math.PI * 180,
 
 -                 time: 600
 
 -             })
 
 -         });
 
 -         // 注册摄像机视角改变事件,更新指南针图片朝向
 
 -         this.app.on(THING.EventType.CameraChange, function () {
 
 -             $('#compass div').css('transform', 'rotateZ(' + _this.getRotation() / Math.PI * -180 + 'deg)')
 
 -         });
 
 -     }
 
 -     /**
 
 -      * 获取旋转角度
 
 -      */
 
 -     getRotation() {
 
 -         let cameraRotation = this.app.renderCamera.rotation;
 
 -         return -cameraRotation.z;
 
 -     }
 
 - }
 
  复制代码 
 - 调用方法如下
 
 
 
  至此,一个可以复位、可以控制的指南针就做好了。 
如有建议,欢迎留言。 
 
 
 
 |