在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;
- }
- }
复制代码
- 调用方法如下
至此,一个可以复位、可以控制的指南针就做好了。
如有建议,欢迎留言。
|