zoukankan      html  css  js  c++  java
  • ThingJS,如何在3D场景中安装“摄像头”?

    如何在3D场景中安装“摄像头”,场景移动并且展示不同的角度,这都是摄像头在起作用,控制摄像头也是一门技术活。

    作为一个物联网可视化平台,ThingJS的优点我们就不再赘述,而开发物联网可视化项目,除了场景模型,就是对于摄像机的控制了(ThingJS将渲染封装到了最底层,使得开发人员无需过多了解建模知识,只需要专注于三维场景的开发),ThingJS中的摄像机是camera对象,我们如果是在ThingJS平台中,打印出camera的信息则需要使用到以下代码:

    1	app.camera.log()  //在控制台中打印摄像机位置信息
    

    接下来讲一下ThingJS控制摄像头的方法:
    1、位置信息用position属性
    2、目标点信息用target属性
    3、盯着物体用LookAt()
    4、设置摄像机位置用fit()方法
    5、摄像机分为园区使用和地球场景使用
    6、摄像机交互控制,包括水平移动、垂直移动、推进或旋转

    摄像机的位置信息以及目标点信息
    camera摄像机有position属性以及target属性:

    var pos = app.camera.position; //获取摄像机镜头位置
    var target = app.camera.target; //获取摄像机目标点位置
    console.log(pos +target); //在控制台打印出摄像机镜头位置以及摄像机目标点位置
    
    

    摄像机的 lookAt() 方法
    一般我们通过摄像机的 lookAt() 方法,可以让摄像机一直“盯着”某个位置或物体看。

     //摄像机一直“盯着”[0,0,0]点看
     app.camera.lookAt([0, 0, 0]);
     //摄像机一直“盯着”某物体看
     var obj = app.query("car01")[0];app.camera.lookAt(obj);
     //取消摄影机一直盯着物体看
     app.camera.lookAt(null);
    
    

    摄像机的 fit() 方法
    通过摄像机的 fit() 方法,也可以设置摄像机位置。

    app.camera.fit({
        position: [100, 100, 100],
        target: [0, 0, 0]
    });
    
    

    如果 fit() 方法中传的是物体对象,那么镜头将“聚焦”到该物体,此时 ThingJS 会计算出该对象的“最佳看点”,从而“自适应”该对象来设置摄像机位置。

    //设置摄像机到物体的“最佳看点”
    app.camera.fit(obj);
    //当不传参数时,设置摄像机到当前整个场景下的“最佳看点”
    app.camera.fit();
    
    

    园区&地球摄像机飞行
    ThingJS中的摄像机分为在园区使用以及在地球场景中使用,所以对于经常在ThingJS中开发园区场景,突然有一天需要将场景应用在地球上时,就会发现摄像机飞行事件无法使用,这是因为在园区中,我们一般使用 flyTo() 方法,而地球中我们需要使用earthFlyTo()方法。
    园区场景-flyTo()

    //从当前摄像机位置飞到指定位置,飞行时间2s,飞行结束后调用回调函数app.camera.flyTo({
        position: [0, 20, 20],
        target: [-30, 10, 0],
        time: 2 * 1000,
        complete: function() {
        console.log("飞行结束");
        }});
        
    //以Quartic.In的插值方式 让飞行速度渐增
        app.camera.flyTo({
        position: [0, 20, 20],
        target: [-30, 10, 0],
        time: 3 * 1000,
        lerpType: THING.LerpType.Quartic.In});
        
    //飞到物体的最佳视角,默认飞行时间3s
        app.camera.flyTo(obj);
        //2s飞到物体的最佳视角
        app.camera.flyTo({
        object: obj,
        time: 2 * 1000,
        complete: function() {
        console.log("飞行结束");
        }});
        
    //自定义飞到物体的摄像机位置参数(同fit)
        app.camera.flyTo({
        object: obj,
        xAngle: 30, //绕物体自身X轴旋转角度
        yAngle: 60, //绕物体自身Y轴旋转角度
        radiusFactor: 3, //物体包围盒半径的倍数
        time: 5 * 1000,
        complete: function() {
        console.log("飞行结束");
        }});
        
    // 也可以通过设置距离物体包围盒中心的距离(radius)确定摄像机位置
        app.camera.flyTo({
        object: obj,
        xAngle: 30, //绕物体自身X轴旋转角度
        yAngle: 60, //绕物体自身Y轴旋转角度
        radius: 3, //距离物体包围盒中心的距离 单位米
        time: 5 * 1000,
        complete: function() {
        console.log("飞行结束");
        }});
    地球场景-earthFlyTo()用法:
    //设置地图中心和相机高度
    app.camera.earthFlyTo({
        lonlat: [116.372, 39.863],//目标点经纬度
        height: 5000,//离地高度
        heading: 60,//水平方向角度
        pitch: 45//垂直方向角度});
        
    //调整地图视角到地图数据范围
    app.camera.earthFlyTo({
        lonlat: [116.372, 39.863],//目标点经纬度
        height: 5000,//离地高度
        heading: 60,//水平方向角度
        pitch: 45//垂直方向角度});
        
    //飞到指定位置
    app.camera.earthFlyTo({
        time: 3000,        
        lonlat: [116.39, 39.96],        
        height: 5000,        
        heading: 90,        
        pitch: 45,        
        complete: function () {          
            console.log('earth fly finished');        
        }      
    });     
            
    //飞到物体     
    let geoPolygon = app.query('.GeoPolygon')[0];     
    app.camera.earthFlyTo({        
        time: 3000,        
        object: geoPolygon,        
        complete: function () {          
            console.log('earth fly finished');        
        }      
    });
    //停止地球上的飞行和旋转动作
    app.camera.stopEarthFly()
    
    

    摄像机交互控制
    在ThingJS中有着关于摄像机使用的官方示例,在这里则仅展示摄像机控制这一示例:

    /**
     * 说明:摄像机控制
     * 操作:点击按钮进行摄像机操作,如果需要复位可直接操作鼠标
     * 教程:摄像机——>交互控制
     * 难度:★★☆☆☆
     */
    var app = new THING.App({
        url: 'https://www.thingjs.com/static/models/storehouse'
    });
    
    
    // 水平移动
    new THING.widget.Button('水平右移', function () {
        app.camera.move(10, 0);
    });
    new THING.widget.Button('水平左移', function () {
        app.camera.move(-10, 0);
    });
    // 垂直移动
    new THING.widget.Button('垂直上移', function () {
        app.camera.move(0, 10);
    });
    new THING.widget.Button('垂直下移', function () {
        app.camera.move(0, -10);
    });
    // 推进
    new THING.widget.Button('向前', function () {
        app.camera.zoom(10);
    });
    new THING.widget.Button('向后', function () {
        app.camera.zoom(-10);
    });
    // 旋转
    new THING.widget.Button('水平旋转', function () {
        app.camera.rotateAround({
            target: app.camera.target,
            yRotateAngle: 10,
            time: 3000
        });
    });
    new THING.widget.Button('俯仰旋转', function () {
        app.camera.rotateAround({
            target: app.camera.target,
            xRotateAngle: 10,
            time: 1000
        });
    });
    
    

    如何搭建、安装和使用摄像头,ThingJS只需要JS代码就能够写出控制摄像头的功能,超轻松!

  • 相关阅读:
    failed to create pid file /var/run/rsyncd.pid: File exists报错
    Ansible系列之roles使用说明
    设置build.gradle打包时自动加时间
    Oracle客户端连接数据库配置
    Gradle实现自动打包,签名,自定义apk文件名
    linux定时任务执行没结果,手动执行有结果问题总结
    实现TableLayout布局下循环取出TableRow控件中的文字内容到list集合
    ImageView的src和background的区别
    关于Merge的整理--Merge的使用方法和注意事项的Demo
    关于Merge的整理--AndroidScreenSlidePager开源库中用到的
  • 原文地址:https://www.cnblogs.com/thingjs/p/13490687.html
Copyright © 2011-2022 走看看