三維場景中常用的路徑動畫

前言

在三維場景中喉镰,除了用逼近真實(shí)的模型代表現(xiàn)實(shí)中的設(shè)備浓体、標(biāo)識物外,通常還會使用一些動畫來表示模型在現(xiàn)實(shí)中一些行為和作用。常見的動畫比如路徑動畫蒜鸡、旋轉(zhuǎn)動畫、發(fā)光動畫敢课、流動動畫等快压。本文將為大家介紹幾種常用的路徑動畫。首先历造,最簡單的自然是直線路徑動畫甩十。

直線路徑動畫

比如以下場景船庇,地鐵需要從上一站A駛?cè)氘?dāng)前站B,在此過程中侣监,我們將AB組合成一條路徑(假設(shè)路徑為直線)鸭轮,使用動畫,不停的設(shè)置地鐵(模型)的在路徑上的位置橄霉,就可以實(shí)現(xiàn)地鐵從A站-B站的動畫過程窃爷。

const points = [A, B];
// 創(chuàng)建路徑
let path = new mono.Path();
points.forEach((point, i) => {
  const { x, y, z } = point;
  if (i == 0) {
    path.moveTo(x, y, z);
  } else {
    path.lineTo(x, y, z);
  }
});
// 動畫
const instance = new mono.Animate({
    form: 0,
    to:1,
    dur:3000,
    delay,
    reverse:false,
    repeat: 1,
    easing,
    onPlay,
    onUpdate: (val) => {
      // 獲取路徑上的點(diǎn)
      const point = path.getPointAt(val);
      // 設(shè)置實(shí)體位置
      entity.setPosition(point);
    },
    onDone,
});
instance.play();

動畫效果:


image

至此,直線路徑動畫就實(shí)現(xiàn)了姓蜂。那么現(xiàn)在想想按厘,現(xiàn)實(shí)場景中不可能只有直線運(yùn)動這種場景,比如小車巡檢钱慢,就屬于一個折線場景逮京,那么我們就需要使用折線動畫來完成。

折線路徑動畫

小車在房間內(nèi)不間斷的通過巡檢監(jiān)控束莫,記錄設(shè)備狀態(tài)及檢測相關(guān)數(shù)據(jù)懒棉。模擬小車巡檢動畫,我們需要采集巡檢小車核心點(diǎn)位:A麦箍、B漓藕、C、D挟裂。同樣的將ABCD組合成路徑享钞,不停的設(shè)置小車(模型)位置

const points = [A, B, C, D];
// 創(chuàng)建路徑
let path = new mono.Path();
points.forEach(...);
// 動畫
const instance = new mono.Animate({
    ...
    onUpdate: (val) => {
      // 獲取路徑上的點(diǎn)
      const point = path.getPointAt(val);
      // 設(shè)置實(shí)體位置
      entity.setPosition(point);
    },
    onDone,
});
instance.play();

動畫效果:折線路徑


image

當(dāng)然,巡檢過程可能是一個循環(huán)的閉合路徑诀蓉,所以可以滿足使用四個點(diǎn)創(chuàng)建閉環(huán)路徑栗竖,行形成閉環(huán)路徑動畫

折線路徑閉環(huán)動畫

const points = [A, B, C, D];
// 創(chuàng)建路徑
let path = new mono.Path();
points.forEach(...);
// 閉環(huán)路徑
path.closePath()
// 動畫
const instance = new mono.Animate({
    ...
});
instance.play();

動畫效果:閉環(huán)路徑


image

上面的折線動畫是完成了,但是轉(zhuǎn)彎的時候似乎略顯生硬渠啤,接下來我們再嘗試如何讓轉(zhuǎn)彎更自然狐肢。

圓潤的折線路徑動畫

其實(shí)很簡單,在已有的折線動畫基礎(chǔ)上沥曹,對路徑先進(jìn)行一步拐角處理份名,讓路徑整體顯得很趨于自然。

const points = [A, B, C, D];
// 創(chuàng)建路徑
let path = new mono.Path();
points.forEach(...);
// 閉環(huán)路徑
path.closePath()
// 獲取平滑路徑, 讓轉(zhuǎn)彎更自然
path = mono.PathNode.prototype.adjustPath(path, 20, 1);
// 動畫
const instance = new mono.Animate({
    ...
});
instance.play();

動畫效果:轉(zhuǎn)彎更加的自然


自然彎道.gif

實(shí)現(xiàn)了圓潤的折線路徑動畫后妓美,貌似看起來已經(jīng)完工了僵腺。其實(shí)再仔細(xì)觀察下,可以發(fā)現(xiàn)壶栋,在轉(zhuǎn)彎的時候辰如,模型沒有同步轉(zhuǎn)向,那么我們需要如何處理呢贵试。

模型與路徑動畫同步旋轉(zhuǎn)

在折線動畫中琉兜,將模型繞對應(yīng)的旋轉(zhuǎn)旋轉(zhuǎn)方向即可

const points = [A, B, C, D];
// 創(chuàng)建路徑
let path = new mono.Path();
points.forEach(...);
// 閉環(huán)路徑 獲取平滑路徑, 讓轉(zhuǎn)彎更自然
...
// 旋轉(zhuǎn)向量
const rotate = new mono.Vec3();
// 動畫
const instance = new mono.Animate({
    onUpdate: (val) => {
      // 位置
      ...
      // 模型同步旋轉(zhuǎn)
      const tangent = path.getTangentAt(val);
      var normal = new mono.Vec3(0, 0, -1);
      rotate.rotationTowards(normal, tangent);
      entity.setRotation(rotate);
    }
});
instance.play();

動畫效果:可以看到小車上的攝像頭是一直朝向設(shè)備

同步.gif

那么凯正,直線路徑動畫和折線路徑動畫介紹完了。從上面動畫截圖中可以看出豌蟋,我們是在一個固定的位置查看動畫廊散,那么,能讓鏡頭沿著路徑一起移動么

鏡頭沿路徑動畫一起移動

顯然梧疲,鏡頭是可以沿著路徑同時移動的奸汇。通常用于巡航(自動巡檢)中.主要是在折線動畫的基礎(chǔ)上,同步設(shè)置鏡頭動畫的位置和朝向點(diǎn)往声。

const points = [....];
// 創(chuàng)建路徑
let path = new mono.Path();
points.forEach(...);
// 閉環(huán)路徑 獲取平滑路徑, 讓轉(zhuǎn)彎更自然
...
// 鏡頭初始位置
  const pos = camera.p(),
    target = camera.t();
  const length = pos.clone().sub(target).length();
// 動畫
const instance = new mono.Animate({
    onUpdate: (val) => {
      // 模型
      ...
      // 鏡頭沿路徑動畫
      const tangent = path.getTangentAt(value);
      point = path.getPointAt(value);
      ntarget = point.clone().add(tangent.multiplyScalar(length));
      camera.p(point);
      camera.lookAt(ntarget);
    }
});
instance.play();

動畫效果:


image

既然能讓鏡頭沿著路徑同步移動,那么是否能讓鏡頭與路徑保持平行移動呢

鏡頭與路徑保持平行一起移動

保持平行移動戳吝,其實(shí)是在點(diǎn)位的基礎(chǔ)上浩销,將鏡頭位置設(shè)置到對應(yīng)距離點(diǎn)位置。以下是基于動畫鏈完成的某流水線作業(yè)動畫听哭,需要路徑動畫同時慢洋,鏡頭同步移動。對動畫鏈有興趣的可參考前文《基于路徑集合的三維動畫鏈

const points = [....];
// 創(chuàng)建路徑
let path = new mono.Path();
points.forEach(...);
// 閉環(huán)路徑 獲取平滑路徑, 讓轉(zhuǎn)彎更自然
...
// 鏡頭相對于目標(biāo)動畫模型的距離
const dis = 550
// 動畫
const instance = new mono.Animate({
    onUpdate: (val) => {
      // 模型
      ...
      // 鏡頭平行X軸動畫
      point = path.getPointAt(value);
      camera.setPosition(point.clone().add(new mono.Vec3(0, dis, dis)));
      camera.lookAt(point);
    }
});
instance.play();

動畫效果:


image

案例說明

上面舉例說明動畫的示意圖陆盘,來自兩個案例普筹,一個是地鐵站三維可視化,可以認(rèn)為是一個軌道交通方面的隘马;另外一個是實(shí)驗(yàn)室車間 流水線可視化太防,主要用于流水線,設(shè)備監(jiān)控等三維可視化呈現(xiàn)酸员。

結(jié)語

至此蜒车,路徑動畫已經(jīng)介紹的差不多了。利用常用的動畫能夠讓整個三維場景更豐滿幔嗦,寫實(shí)酿愧。希望在項目中可以多多利用起來。

如果對可視化感興趣邀泉,可以和我交流嬉挡,微信541002349.

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市汇恤,隨后出現(xiàn)的幾起案子庞钢,更是在濱河造成了極大的恐慌,老刑警劉巖屁置,帶你破解...
    沈念sama閱讀 211,265評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件焊夸,死亡現(xiàn)場離奇詭異,居然都是意外死亡蓝角,警方通過查閱死者的電腦和手機(jī)阱穗,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,078評論 2 385
  • 文/潘曉璐 我一進(jìn)店門饭冬,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人揪阶,你說我怎么就攤上這事昌抠。” “怎么了鲁僚?”我有些...
    開封第一講書人閱讀 156,852評論 0 347
  • 文/不壞的土叔 我叫張陵炊苫,是天一觀的道長。 經(jīng)常有香客問我冰沙,道長侨艾,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,408評論 1 283
  • 正文 為了忘掉前任拓挥,我火速辦了婚禮唠梨,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘侥啤。我一直安慰自己当叭,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,445評論 5 384
  • 文/花漫 我一把揭開白布盖灸。 她就那樣靜靜地躺著蚁鳖,像睡著了一般。 火紅的嫁衣襯著肌膚如雪赁炎。 梳的紋絲不亂的頭發(fā)上醉箕,一...
    開封第一講書人閱讀 49,772評論 1 290
  • 那天,我揣著相機(jī)與錄音徙垫,去河邊找鬼琅攘。 笑死,一個胖子當(dāng)著我的面吹牛松邪,可吹牛的內(nèi)容都是我干的坞琴。 我是一名探鬼主播,決...
    沈念sama閱讀 38,921評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼逗抑,長吁一口氣:“原來是場噩夢啊……” “哼剧辐!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起邮府,我...
    開封第一講書人閱讀 37,688評論 0 266
  • 序言:老撾萬榮一對情侶失蹤荧关,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后褂傀,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體忍啤,經(jīng)...
    沈念sama閱讀 44,130評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,467評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了同波。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片鳄梅。...
    茶點(diǎn)故事閱讀 38,617評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖未檩,靈堂內(nèi)的尸體忽然破棺而出戴尸,到底是詐尸還是另有隱情,我是刑警寧澤冤狡,帶...
    沈念sama閱讀 34,276評論 4 329
  • 正文 年R本政府宣布孙蒙,位于F島的核電站,受9級特大地震影響悲雳,放射性物質(zhì)發(fā)生泄漏挎峦。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,882評論 3 312
  • 文/蒙蒙 一合瓢、第九天 我趴在偏房一處隱蔽的房頂上張望浑测。 院中可真熱鬧,春花似錦歪玲、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,740評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至讹语,卻和暖如春钙皮,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背顽决。 一陣腳步聲響...
    開封第一講書人閱讀 31,967評論 1 265
  • 我被黑心中介騙來泰國打工短条, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人才菠。 一個月前我還...
    沈念sama閱讀 46,315評論 2 360
  • 正文 我出身青樓茸时,卻偏偏與公主長得像,于是被迫代替她去往敵國和親赋访。 傳聞我的和親對象是個殘疾皇子可都,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,486評論 2 348

推薦閱讀更多精彩內(nèi)容