攝像頭也是物聯網中的一種數據采集設備,內置傳感器就可以通過圖像、攝像等功能采集收據,對接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縮短了這一流程,才能夠讓整個物聯網項目開發成本大大降低。
