一篇文章了解如何開發攝像頭跟隨物體移動功能


攝像頭也是物聯網中的一種數據采集設備,內置傳感器就可以通過圖像、攝像等功能采集收據,對接ThingJS平台的3D場景,需了解攝像頭跟隨物體移動的動作。

在了解攝像機跟隨物體移動之前,我們需要先了解攝像機,攝像機作為ThingJS中十分重要的一個對象,需要我們認真了解和學習。

攝像機包含兩個重要的位置參數:鏡頭位置 position 和被拍攝物體的位置 target (又叫目標點)。(具體可以看看
https://www.thingjs.com/guide/cn/tutorial_Introduce/Camera.html)

形象點來說,鏡頭就像是手機的相機,攝像頭的定位決定了拍攝的角度,而被拍攝物體的位置更好理解了,物體可以是靜止不動的,也可以是移動的,所以ThingJS新推出攝像機跟隨物體移動的新功能,如何一步步實現呢?

在跟隨物體移動之前,我們需要了解物體在程序語言里移動方式,例如位移(move to)或讓物體沿着不同的路徑移動(move path)等,路徑有方形路徑、圓形路徑,網頁端通過點擊按鈕進行切換。

鏡頭跟隨物體移動

ThingJS中世界坐標系使用position屬性,想象一下,跟隨物體移動(move path)的時候,攝像頭需要一個合適的拍攝位置,比如正前方或后上方,那么改變這個坐標的position值就可以了。ThingJS默認position [0, 5, -10] 代表 攝像機位置為“移動小車后上方”,意味着向后移動到10m處,且向上移動5m,形成俯視定位,這就是世界坐標系下攝影機位置的計算方式。

跟隨物體移動用到的path,主要是為物體設計一條有弧度的移動路徑,由世界坐標系下的坐標點組成。所以,需要獲取一個坐標點構成的數組,通過每一幀更新攝像機的位置實現沿着路徑移動,最后使用stop moving接口來終止移動。

var app = new THING.App({
    url: 'https://www.thingjs.com/static/models/simplebuilding'
});

// 加載場景后執行
app.on('load', function () {
    // 通過 name 查詢到場景中的車
    var car = app.query('car01')[0];

    // 世界坐標系下坐標點構成的數組 關於坐標的獲取 可利用「工具」——>「拾取場景坐標」
    // 拐角處多取一個點,用於轉向插值計算時更平滑
    var path = [[0, 0, 0], [2, 0, 0], [20, 0, 0], [20, 0, 2], [20, 0, 10], [18, 0, 10], [0, 0, 10], [0, 0, 8], [0, 0, 0]];
    car.position = path[0];

    car.movePath({
        path: path,
        orientToPath: true,
        loopType: THING.LoopType.Repeat,
        time: 10 * 1000
    })

    new THING.widget.Button('攝像機跟隨物體', function () {
        // 每一幀設置攝像機位置 和 目標點
        car.on('update', function () {
            // 攝像機位置為 移動小車后上方
            // 為了便於計算 這里用了坐標轉換 將相對於小車的位置 轉換為 世界坐標
            app.camera.position = car.selfToWorld([0, 5, -10]);
            // 攝像機目標點為 移動小車的坐標
            app.camera.target = car.position
        }, '自定義攝影機跟隨');
    });

    new THING.widget.Button('停止', function () {
        car.off('update', null, '自定義攝影機跟隨');
    });
});

3D的動效只需要JS語言在瀏覽器上開發實現即可,正因為ThingJS縮短了這一流程,才能夠讓整個物聯網項目開發成本大大降低。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM