這次帶給大家怎樣用H5的WebGL實現3D虛擬機房的漫遊動畫,用H5的WebGL實現3D虛擬機房的漫遊動畫的注意事項有哪些,下面就是實戰案例,一起來看一下。
第一人稱在3D 中的用法要參考第一人稱在射擊遊戲中的使用,第一人稱射擊遊戲(FPS)是以第一人稱視角為中心圍繞槍和其他武器為基礎的視頻遊戲類型;也就是說,玩家透過主角的眼睛來體驗動作。自從流派開始以來,先進的3D和偽 3D圖形已經對硬體發展提出了挑戰,而多人遊戲已經不可或缺。
現在博物館或公司也經常使用到 3D 動畫做宣傳片等等,3D動畫演繹最大的優勢,便是在於內容與形式上給人的真實感受。它比平面作品更直觀,比 2D 動畫更真實,所以更能給觀賞者以置身於廣告環境當中的感受,大大增強廣告的說服力。 3D 技術的發展甚至挑戰受眾的分辨能力,使受眾的判斷遊離於與虛擬和現實之間。
而且 3D特效的應用為創意提供了更加廣闊的思維空間,並成為創意執行的可靠保證,並豐富了創意的形式和風格手段。根據廣告主題的表現訴求,可以營造出夢幻般的神奇氛圍來刺激打動受眾,從而起到與受眾溝通的目的。
3D動畫宣傳片將3D動畫、特效鏡頭、企業影片、照片、未來前景等內容透過後期合成、配音、解說形成一部直覺、生動、喜聞樂見的高品味的企業廣告宣傳片,讓社會不同層面的人士對企業產生正面的、正面的、良好的印象,從而建立對企業的好感與信任,並信賴該企業的產品或服務。
現在 3D 發展地如此迅速也要感謝人類對於「現實」的追求,所以學好用好 3D 是未來成功必不可少的一部分。
本文例子的想法是進入一個機房參觀,打開門的動作是再生動不過了, 再加上適當地轉彎,基本上完全模擬了人在機房中參觀的效果。還有一個好處就是,如果要示範給領導者看而又不用操作,這種酷炫的效果領導一定會很滿意!
介面上的「reset」和「start」兩個按鈕是直接加在body 體中的button,並在這兩個按鈕上添加點擊事件:
<div></div><div></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;//两点之间的距离通过三角形勾股定理计算 怕碰墙所以-200g3d.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 函数。至此,全部代码解释完毕,很短的代码量,却做出了这么大的工程!
相信看了这些案例你已经掌握了方法,更多精彩请关注php中文网其它相关文章!
相关阅读:
以上是怎麼用H5的WebGL實現3D虛擬機房的漫遊動畫的詳細內容。更多資訊請關注PHP中文網其他相關文章!

HTML5帶來了五個關鍵改進:1.語義化標籤提升了代碼清晰度和SEO效果;2.多媒體支持簡化了視頻和音頻嵌入;3.表單增強簡化了驗證;4.離線與本地存儲提高了用戶體驗;5.畫布與圖形功能增強了網頁的可視化效果。

HTML5的核心特性包括語義化標籤、多媒體支持、離線存儲與本地存儲、表單增強。 1.語義化標籤如、等,提升代碼可讀性和SEO效果。 2.和標籤簡化多媒體嵌入。 3.離線存儲和本地存儲如ApplicationCache和LocalStorage,支持無網絡運行和數據存儲。 4.表單增強引入新輸入類型和驗證屬性,簡化處理和驗證。

H5提供了多種新特性和功能,極大地增強了前端開發的能力。 1.多媒體支持:通過和元素嵌入媒體,無需插件。 2.畫布(Canvas):使用元素動態渲染2D圖形和動畫。 3.本地存儲:通過localStorage和sessionStorage實現數據持久化存儲,提升用戶體驗。

H5和HTML5是不同的概念:HTML5是HTML的一個版本,包含新元素和API;H5是基於HTML5的移動應用開發框架。 HTML5通過瀏覽器解析和渲染代碼,H5應用則需要容器運行並通過JavaScript與原生代碼交互。

HTML5的關鍵元素包括、、、、、等,用於構建現代網頁。 1.定義頭部內容,2.用於導航鏈接,3.表示獨立文章內容,4.組織頁面內容,5.展示側邊欄內容,6.定義頁腳,這些元素增強了網頁的結構和功能性。

HTML5和H5沒有區別,H5是HTML5的簡稱。 1.HTML5是HTML的第五個版本,增強了網頁的多媒體和交互功能。 2.H5常用於指代基於HTML5的移動網頁或應用,適用於各種移動設備。

HTML5是超文本標記語言的最新版本,由W3C標準化。 HTML5引入了新的語義化標籤、多媒體支持和表單增強,提升了網頁結構、用戶體驗和SEO效果。 HTML5引入了新的語義化標籤,如、、、等,使網頁結構更清晰,SEO效果更好。 HTML5支持多媒體元素和,無需第三方插件,提升了用戶體驗和加載速度。 HTML5增強了表單功能,引入了新的輸入類型如、等,提高了用戶體驗和表單驗證效率。

如何寫出乾淨高效的HTML5代碼?答案是通過語義化標籤、結構化代碼、性能優化和避免常見錯誤。 1.使用語義化標籤如、等,提升代碼可讀性和SEO效果。 2.保持代碼結構化和可讀性,使用適當縮進和註釋。 3.優化性能,通過減少不必要的標籤、使用CDN和壓縮代碼。 4.避免常見錯誤,如標籤未閉合,確保代碼有效性。


熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

Safe Exam Browser
Safe Exam Browser是一個安全的瀏覽器環境,安全地進行線上考試。該軟體將任何電腦變成一個安全的工作站。它控制對任何實用工具的訪問,並防止學生使用未經授權的資源。

禪工作室 13.0.1
強大的PHP整合開發環境

mPDF
mPDF是一個PHP庫,可以從UTF-8編碼的HTML產生PDF檔案。原作者Ian Back編寫mPDF以從他的網站上「即時」輸出PDF文件,並處理不同的語言。與原始腳本如HTML2FPDF相比,它的速度較慢,並且在使用Unicode字體時產生的檔案較大,但支援CSS樣式等,並進行了大量增強。支援幾乎所有語言,包括RTL(阿拉伯語和希伯來語)和CJK(中日韓)。支援嵌套的區塊級元素(如P、DIV),

SublimeText3漢化版
中文版,非常好用

Atom編輯器mac版下載
最受歡迎的的開源編輯器