基於HTML5的WebGL經典3D虛擬機房漫遊動畫

2021-01-21 CSDN

第一人稱在 3D 中的用法要參考第一人稱在射擊遊戲中的使用,第一人稱射擊遊戲(FPS)是以第一人稱視角為中心圍繞槍和其他武器為基礎的視頻遊戲類型 ; 也就是說,玩家通過主角的眼睛來體驗動作。自從流派開始以來,先進的 3D 和偽 3D 圖形已經對硬體發展提出了挑戰,而多人遊戲已經不可或缺。

Doom 的截圖,這個流派的突破遊戲之一,展示了第一人稱射擊遊戲的典型視角

現在博物館或者公司也經常使用到 3D 動畫做宣傳片等等,3D 動畫演繹最大的優勢,便是在於內容與形式上給人的真實感受。它比平面作品更直觀,比 2D 動畫更真實,所以更能給觀賞者以置身於廣告環境當中的感受,大大增強廣告的說服力。3D 技術的發展甚至挑戰受眾的分辨能力,使受眾的判斷游離於與虛擬和現實之間。

而且 3D 特效的應用為創意提供了更加廣闊的思維空間,並成為創意執行的可靠保證,並豐富了創意的形式和風格手段。根據廣告主題的表現訴求,可以營造出夢幻般的神奇氛圍來刺激打動受眾,從而起到與受眾溝通的目的。

3D動畫宣傳片將 3D 動畫、特效鏡頭、企業視頻、照片、未來前景等內容通過後期合成、配音、解說形成一部直觀、生動、喜聞樂見的高品位的企業廣告宣傳片,讓社會不同層面的人士對企業產生正面的、積極的、良好的印象,從而建立對企業的好感與信任,並信賴該企業的產品或服務。

現在 3D 發展地如此迅速也要感謝人類對於「現實」的追求,所以學好用好 3D 是未來成功必不可少的一部分。

本文例子的思路是進入一個機房參觀,打開門的動作是再生動不過了, 再加上適當地轉彎,基本上完全模擬了人在機房中參觀的效果。還有一個好處就是,如果要演示給領導看而又不用操作,這種炫酷的效果領導一定會很滿意!

http://www.hightopo.com/demo/room-walkthrough/index.html

界面上的「reset」和「start」兩個按鈕是直接加在 body 體中的 button,並在這兩個按鈕上添加點擊事件:

<div style="right: 50px;background-image: url(run.png);" onclick="startAnim();"></div> <div style="right: 100px;background-image: url(reset.png);" onclick="reset();"></div>

整個場景由 HT 封裝的 3D 組件搭建形成的,構造這麼大的場景是需要一定量的代碼的,為了簡化,我把場景單獨拿出來,並用 HT 封裝的 ht.JSONSerializer 類將場景序列化為 json,代碼中只引入了生成後的 json 文件,為了讓大家更明確,我這邊做個示例,假設已經搭建好 3D 場景了:

dm = new ht.DataModel(); g3d = new ht.graph3d.Graph3dView(dm); //.......構建好場景 dm.serialize();//可以填入number參數,作為空格縮進值

既然我們已經搭建好環境,轉成了 json 文件,代碼中不好控制,這種情況下我們會將 DataModel 數據模型再反序列化,這個函數的功能就是將 json 格式轉成對象,並將反序列化的對象傳入到 DataModel 數據模型中,詳情請參考HT for Web 序列化手冊:

var g3d = window.g3d = new ht.graph3d.Graph3dView(), dataModel = g3d.dm(), view = g3d.getView(), path = null; g3d.setMovableFunc(function(data) { return false; }); g3d.setVisibleFunc(function(data) { if (data.getName() === "path") { return false; } return true; }); g3d.setEye([523, 5600, 8165]); g3d.setFar(60000); dataModel.deserialize(json);

我們目前需要操作場景中的「門」、以及我們將要走的路線「path」,遍歷 DataModel 數據模型,獲取這兩個數據:

for (var i = 0; i < dataModel.size(); i++) { var data = dataModel.getDatas().get(i); if (data.getName() === "門") {//json中設置的名稱 window.door = data; } if (data.getName() === "path") { path = data; } if (window.door && path) {//獲取到door 和 path 的data之後就跳出循環 break; } }

這個例子中簡單來說就只有四個動作,「重置」回到原點、「開始動作」、「向前移動」,「停止」。點擊「開始」按鈕,在「開始動作」中我們只做了一個動作,「開門」動作,動作結束之後調用「forward」函數向前移動:

function startAnim() { if (window.isAnimationRunning) { return; } reset(); window.isAnimationRunning = true;//動畫是否正在進行 ht.Default.startAnim({ frames: 30, // 動畫幀數,默認採用`ht.Default.animFrames`。 interval: 20, // 動畫幀間隔,默認採用`ht.Default.animInterval`。 finishFunc: function() {// 動畫結束後調用的函數。 forward(); }, action: function(t){ // action函數必須提供,實現動畫過程中的屬性變化。 door.setRotationY(-120 * Math.PI / 180 * t); } }); }

這邊的「reset」函數就是「重置」回到原點的功能,我們通過這個函數將所有變化過的都恢復初始的位置,包括「門」的位置:

function reset() { if (window.isAnimationRunning) { return; } g3d.setCenter([0,0,0]); g3d.setEye([523, 5600, 8165]); window.forwardIndex = 0; door.setRotationY(0); }

要「移動」,肯定需要走路的「路徑」,也就是我們剛剛獲取到的「path」,通過 window.points = path.getPoints()._as; 獲取「path」中的所有元素,初始化 window.forwardIndex = 0; 通過控制「path」中前後兩點來設置 3D 場景中的 Eye 和 Center,這樣就能營造一個我們是第一人的效果:

var point1 = points[forwardIndex], point2 = points[forwardIndex + 1]; var distanceX = (point2.x - point1.x), distanceY = (point2.y - point1.y), distance = Math.sqrt(distanceX * distanceX + distanceY * distanceY)-200;//兩點之間的距離通過三角形勾股定理計算 怕碰牆所以-200 g3d.setEye([point1.x, 1600, point1.y]);//眼睛 g3d.setCenter([point2.x, 1600, point2.y]);//我

HT 中 3D 組件有一個 walk(step, anim, firstPersonMode) 方法,該函數同時改變eye和center的位置,也就是eye和center在兩點建立的矢量方向上同時移動相同的偏移量。step為偏移的矢量長度值。firstPersonMode參數為空時則默認採用Graph3dView#isFirstPersonMode()當前值, 如果為第一人稱模式調用walk操作,該函數會考慮Graph3dView#getBoundaries()邊界限制。

g3d.walk(distance, { frames: 50, interval: 30, easing: function(t) {return t; }, finishFunc: function() { forwardIndex += 1; if (points.length - 2 > forwardIndex) {//points.length = 5 g3d.setCenter([point2.x, 1600, point2.y]);//把結束點變成起始點 g3d.rotate(Math.PI / 2, 0, { frames: 30, interval: 30, easing: function(t) {return t;}, finishFunc:function() { forward();} }); } else { var lastPoint = points[points.length - 1];//json 中path的points 的最後一個點 g3d.setCenter([lastPoint.x, 1400, lastPoint.y]); g3d.rotate(-Math.PI / 2, 0, { frames: 30, interval: 30, finishFunc: function() { window.isAnimationRunning = false; } }); } } });

不管「path」的點有多少個,這個判斷語句還是能運作,只在最後一個點是跳出 finishFunc 動畫結束後調用的函數,並將 window.isAnimationRunning 值設為 false 停止 startAnim 函數。如果不是最後一個點,用戶「旋轉」之後,回調 forward 函數。至此,全部代碼解釋完畢,很短的代碼量,卻做出了這麼大的工程!

相關焦點

  • 基於WebGL的虛擬太陽系漫遊技術實現 ThingJS 科幻片
    一、功能需求B/S架構為主,通過瀏覽器在線訪問,無需安裝任何插件可觀察太陽系中太陽和各行星的3D模型及其運行狀況各行星運行軌道可視化簡單操作鍵盤滑鼠可實現自由漫遊點擊太陽或行星時顯示該天體的常識信息隨時控制太陽系運行速度準確度高,基於各項真實太陽係數據及運行製作運行基本無卡頓,對用戶輸入實時響應二、運行需求要求跨平臺、跨終端在線展示,兼容PC電腦
  • 基於WebGL的智慧校園可視化全景漫遊技術實踐 ThingJS
    #三維可視化##3D開發#智慧校園總體設計與規劃用戶與虛擬場景的互動實現全局場景的漫遊模式國內各大高校,近幾年紛紛搭建了3D智慧校園,如清華大學智慧校園系統,更是實現了虛擬課堂功能。新華三集團與優鍩ThingJS達成技術戰略合作,利用ThingJS平臺構建3D智慧校園,創建一個足不出戶就可以了解校園地理信息與文化背景的虛擬平臺。1. 總體設計與規劃智慧校園系統的架構設計分為基礎層、數據層、服務層、應用層和表示層五個層次。
  • 八大瘋狂的 HTML5 Canvas 及 WebGL 動畫效果
    HTML5、WebGL和JavaScript改變了長久以來的動畫製作行業。在過去的幾年中,我們想要製作卓越的網頁動畫只能使用Flash和Java Applet。
  • 基於WebGL的3D可視化告警系統關鍵技術解析 ThingJS
    WebGL技術相較於傳統的Web3D技術有兩大優點:第一,通過JavaScript腳本語言實現網絡交互式三維動畫製作,無需依賴任何瀏覽器插件;第二,WebGL基於底層的 OpenGL接口實現,具有底層圖形硬體(GPU)加速功能。WebGL繪製3D模型的過程分為四個步驟如下:第一,獲取頂點坐標。
  • WebGL 3D程序開發
    WebGL完美地解決了現有的Web交互式三維動畫的兩個問題:第一,它通過HTML腳本本身實現Web交互式三維動畫的製作,無需任何瀏覽器插件支持;第二,它利用底層的圖形硬體加速功能進行的圖形渲染,是通過統一的、標準的、跨平臺的OpenGL接口實現的。WebGL是內嵌在瀏覽器中的,不必安裝插件和庫就可以直接使用它。
  • 基於HTML5 的 WebGL 3D 版俄羅斯方塊
    = new ht.graph3d.Graph3dView(dataModel);g3d.addToDOM();var node = new ht.Node();node.s({  'shape3d': 'damBoard',  'shape3d.reverse.flip': true,  '3d.movable': false,  '3d.editable': false,  '3d.selectable
  • 令人激動的新興 Web 技術:WebGL和SVG
    WebGL  WebGL 是一種基於 Web 的 Graphic 庫,由非盈利組織 Khronos 運營,目前結合 HTML5元素廣泛應用在 3D 圖形開發中。http://dev.opera.com/articles/view/an-introduction-to-webgl/作者 Luz Caballero,簡介可以獲得的各種庫。  Raw WebGL 101。http://dev.opera.com/articles/view/raw-webgl-part1-getting-started/適合那些不使用庫的用戶。
  • 虛擬與真實的交界——那些架空題材動畫
    在真人影視作品當中,科幻類題材的動畫一直都是一個熱門。誕生過諸如《2001:太空漫遊》、《銀翼殺手》這樣優秀的作品。當中充滿了導演對於人的思考、對於世界的擔憂。不僅限於真人作品,在動畫作品當中也不乏有一些優秀的科幻題材作品。今天就挑選科幻作品當中的賽博朋克作品和廢土兩類作品來盤點一下。
  • ThingJS:基於WebGL的3D技術在網頁中的運用
    因此,很多3D圖形引擎庫應運而生,直接使用Javascript腳本語言開發,將WebGL進行不同程度的封裝,例如「three js「、「scenceJS」、「Oak3d」和「simjs」等,這些引擎庫能夠讓用戶更加方便地進行3D圖形繪製和動畫的製作。
  • WebGL 入門 – WebGL框架
    但是,也有很多人基於WebGL開發出了各種開源框架,現在,我們就來看看目前有哪些框架能夠為我們所用。Three.js Three.js 是一個開源的JavaScript 3D引擎,該項目的目標是創建一個低複雜、輕量級的3D庫,用最簡單、直觀的方式封裝WebGL中的常用方法。
  • 基於webgl的三維室內空間邏輯建模 three.js ThingJS
    三維室內場景基本都帶了默認的層級切換腳本,讓相機視角進入建築內,因此出入口不僅是建築可視化的一部分,也是獲取建築內信息的一個虛擬通道。為了增強逼真感,與管理人員進行協調後,對室內進行了較為全面的照片採集工作,基於CAD建築設計圖和照片來製作室內模型,室外的建築裡面也會按照建築設計圖,與室內模型一同製作。具體分為5個步驟:*1.
  • webgl 迷宮項目開發總結
    收穫webgl 三個js庫webgl-utils.jswebgl-debug.jscuon-utils.js圖片加載var img = new Image();這樣可以防止webgl在渲染的時候圖片還沒加載完而出現黑屏的問題。監聽鍵盤事件保證事件代碼只運行一次。否則會重複綁定多個事件,也就是按鍵一次會觸發多次事件處理。
  • 回顧經典動畫,你還記得2008年的——《福娃》嗎?
    回顧國漫經典,重溫兒時歲月。大家好,今天小編帶大家回顧的經典國漫是——《福娃》系列動畫。說起福娃,我們都知道,他們是「2008年北京奧運會的吉祥物」。但你是否還記得,當年紅遍大江南北的《福娃》動畫片呢?今天,小編就帶大家回顧下這部經典國漫。
  • html5中nav標籤(導航連結)的詳細介紹
    本篇將介紹html5中nav標籤(導航連結)的詳細用法,有興趣的朋友可以了解一下!在html5版本中,新增了很多語義標籤,比如:header標籤、footer標籤、aside標籤、nav標籤等等。這些語義標籤沒有實際的顯示效果,只是起到語義的作用。今天小編要介紹的就是其中一個,即nav標籤。
  • 這8部3D動畫,沒看過的好意思說自己是90後?圖2熱播14年
    如果說是現在的3d動畫,大家印象中想起來的第一刻是《雷鋒的故事》呢,還是《神兵小將的第2部》呢?其實這些3d動畫整體看起來的話,也讓人覺得有點反胃,畢竟遊戲的製作和之前相比真的是天差地別,那麼接下來就帶大家來看一下早期的8部3d動畫,沒看過的真的不好意思說自己是90後了。
  • HTML5調用攝像頭並拍照
    利用html5特性,調用攝像頭,並利用canvas拍照先簡單的添加需要的控制項<video id="video" autoplay=""style='width:640px;height:480px'></video><button id='picture
  • 小羊肖恩啟程"2019太空漫遊" 主創揭秘動畫製作趣聞
    原標題:小羊肖恩啟程「2019太空漫遊」 黑面白絨毛外套,露齒歪嘴魔性笑,不會說話但渾身都是喜劇梗的小羊肖恩時隔4年又回來了!由英國阿德曼動畫工作室出品的黏土動畫《小羊肖恩2:末日農場》(後簡稱《小羊肖恩2》)即將於12月28日在內地公映,影片講述了肖恩和朋友們在農場裡發現了迷路的小外星人嚕啦(LULA),肖恩決定要和朋友們一起送嚕啦回家。然而來自秘密機構的神秘特工卻盯上了嚕啦,為了讓嚕啦順利與家人團聚,肖恩和朋友們的歡樂冒險開始了。
  • WebGL 1.0標準規範正式公布 3D網際網路開啟
    WebGL 1.0正式版標準規範全文:http://www.khronos.org/registry/webgl/specs/latest/
  • 回顧經典國漫——《豬豬俠》系列動畫
    回顧國漫經典,重溫兒時歲月大家好,今天小編為大家帶來的是,童年回憶《豬豬俠》系列的番外與大電影。這部動畫,同樣是由廣東詠聲文化傳播有限公司出品,古志斌,陸錦明執導,陸雙等人參與配音的一部動畫電影。這部動畫電影,劇情和豬豬俠第9部《豬豬俠之百變聯盟》相連。講述的是,童話世界結束了與黑暗世界怪獸的戰鬥,終於恢復和平。一直承擔著保護童話世界使命的變身戰隊,在日常虛擬訓練系統中遭遇變故。