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

2021-01-20 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
    #三維可視化##3D開發#智慧校園總體設計與規劃用戶與虛擬場景的互動實現全局場景的漫遊模式基礎平臺採用的是伺服器,ThingJS平臺提供在線發布和離線部署兩個項目管理功能,本文選擇局域部署,採用Windows平臺配合Tomcat來配置伺服器;數據層主要負責文本數據、多媒體數據、關係型數據的存儲管理;服務層負責給應用層提供基礎性服務;應用層組件可以單獨使用,提供監控管理、角色模式漫遊和全局模式漫遊;表示層將系統進行客戶端的展示,即對用戶所能直觀看到的頁面進行展示
  • 八大瘋狂的 HTML5 Canvas 及 WebGL 動畫效果
    HTML5、WebGL和JavaScript改變了長久以來的動畫製作行業。在過去的幾年中,我們想要製作卓越的網頁動畫只能使用Flash和Java Applet。
  • 基於WebGL的在線3D建模與互動腳本開發系統 ThingJS
    #三維可視化##3D開發#ThingJS編輯界面布局3D建模與場景搭建方法交互控制腳本開發關鍵點ThingJS平臺基於 Web交互控制腳本開發虛擬漫遊ThingJS中提供了多種用於漫遊的控制器,包括Track BallControls、 FlyControls RollControls、 OrbitControls、 FirstPersonContro、 PathControls。
  • 圖形學——webgl動畫
    實現一個動畫也是比較簡單的,就是不斷擦除和重新繪製圖形,並且在每次重新繪製的時候進行改變其角度就實現了動畫。我們還是用之前的三角形進行實現一個旋轉三角形,在一定的時間去重新修改旋轉角度,來實現動畫效果。
  • 建築漫遊動畫製作過程是什麼!
    建築漫遊動畫是將「虛擬實境」技術應用在城市規劃、建築設計等領域。近年來隨著三維技術的發展,建築漫遊動畫在國內外已經得到了越來越多的應用,因其真實建築的空間感和大面積三維地形的仿真等特性,受到了建築行業的青睞,那麼建築漫遊動畫的製作過程是什麼呢?下面悅揚傳媒跟大家說說!
  • Egret 3D 1.4 正式發布:新增17個新特性,3D編輯器公開測試
    如果能基於引擎內置的 shader 進行某些修改或擴展,就能在保留原有 shader 功能的同時,改變或擴展某些功能(通常是對頂點或 uv 的再次映射、對顏色的重新採樣等)。在線示例(見官網)支持 PBR 材質基於物理的標準材質,使用 PBR 材質渲染可以使場景看起來更加真實。
  • 隨身WiFi行業進駐手機虛擬SIM卡市場,漫遊寶/漫遊超人/環球漫遊誰...
    各大巨頭科技公司如小米,華為,蘋果紛紛發力,相繼推出類似功能,虛擬SIM的熱潮有增無減,有老牌拓展,也有黑馬進入。近日,鳳凰財經新聞報導指出國內最大出境移動WiFi公司Skyroam漫遊寶,與手機品牌商天瓏(糖果,Wiko品牌),在印尼正式發布全球首批無需插卡即可上網的「免費流量」手機。
  • 隨身WiFi進駐虛擬SIM市場 漫遊寶/漫遊超人誰是真正的黑馬?
    隨身WiFi行業進駐手機虛擬SIM卡市場,漫遊寶/漫遊超人/環球漫遊誰是真正的黑馬?   通信世界網消息(CWW)物聯網的世界裡,傳統插拔SIM卡聯網的方式早已不適用,逐步取而代之的是通過軟體實現SIM卡的方式。
  • 建築漫遊動畫為地產行業帶來哪些用途!
    建築漫遊動畫是三維動畫表現中較為常見的一種類型,是採用三維動畫技術結合電影表現手法,讓人們能夠在虛擬的三維環境中,用動態交互的方式對未來的建築或城區進行身臨其境的全方位審視,真實建築的空間感,大面積的三維地形仿真,這些都是傳統二維無法比擬的。
  • 如何用3dmax做一個室內漫遊動畫?有案例、超簡單、低成本
    那麼如何用3dmax做一個室內漫遊動畫,同時還要求很簡單和低成本呢?使用渲染100的1元簡幀動畫。素材來源於3dmax全景圖,與渲染傳統全景VR的全景圖設置方式一致,保持了渲染成本低、製作方便的優點,同時在全景場景中可以實現鏡頭的推進漫遊動畫,實現80%真實3d動畫效果,完全滿足市場上對於3d效果圖展示的需求。
  • webgl 迷宮項目開發總結
    收穫webgl 三個js庫webgl-utils.jswebgl-debug.jscuon-utils.js圖片加載var img = new Image();這樣可以防止webgl在渲染的時候圖片還沒加載完而出現黑屏的問題。監聽鍵盤事件保證事件代碼只運行一次。否則會重複綁定多個事件,也就是按鍵一次會觸發多次事件處理。
  • ThingJS:基於WebGL的3D技術在網頁中的運用
    因此,很多3D圖形引擎庫應運而生,直接使用Javascript腳本語言開發,將WebGL進行不同程度的封裝,例如「three js「、「scenceJS」、「Oak3d」和「simjs」等,這些引擎庫能夠讓用戶更加方便地進行3D圖形繪製和動畫的製作。
  • 3D動畫逐漸取代2D動畫?國產動畫給了我們相反的答案
    日本動漫對於中國觀眾長期的侵淫,所塑造出的獨特2d動畫審美,已經融入中國動畫觀眾的方方面面,已經達到潛意識的程度。歐美動畫再經典都是小圈子(主要是連載動畫,動畫電影好萊塢和迪士尼有統治地位)。國內2d動畫要走歐美的路子倒也可以。
  • 9款令人驚嘆的HTML5 3D動畫應用
    之前我們已經向大家分享了很多HTML5動畫應用了,大部分都非常炫酷,也有一小部分是很實用的。今天我們要向各位HTML5動畫愛好者介紹更多的HTML5 3D動畫應用,希望大家能更加喜歡。1、HTML5鯨魚動畫 又一款超酷HTML5動畫之前看到過同樣效果的一款鯨魚動畫,不過可惜的是那個動畫是用flash製作的。今天我找到了基於HTML5的鯨魚動畫,鯨魚會隨著滑鼠的移動而遊動,畫面非常立體,鯨魚也超級逼真。真的,HTML5確實很給力,HTML5動畫完全可以完成flash能做的事情。
  • 10款讓人驚嘆的HTML5圖片動畫特效
    現在網頁上的圖片已經不再是10幾年前那種低像素的靜態圖片了,有了HTML5和jQuery,我們可以讓一張普通的圖片變得多姿多彩,特別是利用HTML5,還可以實現一些很複雜的圖片動畫特效。下面分享的10款圖片特效就是基於HTML5和jQuery的,一起來看看吧。
  • 建築漫遊動畫製作規劃和發展前景介紹
    建築漫遊動畫是一種新的計算機應用技術,它使用軟體創建一個虛擬世界。建築漫遊主要是基於3dmax和後期軟體,結合其他軟體,給用戶帶來強烈逼真的感官衝擊,獲得身臨其境的體驗。在製作三維建築漫遊動畫之前,要仔細規劃,學習具有良好設計感的作品,了解建築漫遊動畫的製作步驟。
  • 3d動畫的製作流程有哪些?
    在實際操作中一個好的3D動畫並不是一個人的工作,它要求多人合作共同完成,因此製作流程是很重要的,它基本上決定了動畫的質量。
  • 3D動畫還原女子開車進故宮路線 引發網友熱議
    3D動畫還原藝虎動畫介紹,3d動畫製作是在計算機上建立一個虛擬空間,根據待顯示對象的形狀和大小建立模型和場景,然後設定模型的運動軌跡,從而生成三維動態圖像。3d動畫製作作品影響著我們生活的方方面面,近年來,國內3d動畫越來越多,主要是數位技術的發展,使計算機三維動畫設計成功地取代了原有的影視製作設備,從而發揮重要作用。接下來,藝虎動畫將對此進行詳細的分析。
  • 上海施工動畫製作選哪家_合肥迪維數字科技
    三維動畫,是近年來隨著計算機軟硬體技術的發展而產生的一新興技術。施工動畫軟體在計算機中首先建立一個虛擬的世界,再按照要表現的對象的形狀尺寸建立模型以及場景,再根據要求設定模型的運動軌跡、虛擬攝影機的運動和其它動畫參數,後按要求為模型賦上特定的材質,並打上燈光。隨著計算機三維影像技術的不斷發展,三維圖形技術越來越被人們所看重。
  • 商迪3D線上VR展覽720°VR房產全景3D展示
    商迪3d致力於VR虛擬實境三維可視化技術的設計、開發及應用全方位精準解析類房地產項目,將領先的虛擬技術應用到現實。實現房地產行業與線上VR展覽的深度結合。商迪3D線上720°VR展示+房地產的創新模式,讓原本十分傳統的地產營銷有了新思路,開發商對此亦是青睞有加,用戶通觀看過線上720°VR沉浸式房產展示也得到了與以往完全不同的全新體驗。