亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 開發 > HTML5 > 正文

基于HTML5的WebGL經典3D虛擬機房漫游動畫

2024-09-05 07:22:12
字體:
來源:轉載
供稿:網友

第一人稱在 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></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 函數。至此,全部代碼解釋完畢,很短的代碼量,卻做出了這么大的工程!

總結

以上所述是小編給大家介紹的基于HTML5的WebGL經典3D虛擬機房漫游動畫,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對武林網網站的支持!

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
精品国产依人香蕉在线精品| 欧美激情欧美狂野欧美精品| 欧美日韩免费在线观看| 欧美又大又粗又长| 日韩av电影在线播放| 欧美限制级电影在线观看| 国产色视频一区| 亚洲大胆人体av| 国产精品青草久久久久福利99| 国产亚洲欧美日韩美女| 国产日韩欧美夫妻视频在线观看| 国产精品第七影院| 亚洲女人初尝黑人巨大| 91国内揄拍国内精品对白| 国产精品久久久久久av| 国产精品wwww| 日韩成人在线观看| 亚洲二区中文字幕| 国产精品丝袜一区二区三区| 亚洲a中文字幕| 精品在线观看国产| 亚洲精品乱码久久久久久金桔影视| 欧美亚洲一级片| 日韩欧美在线第一页| 国内精品一区二区三区| 国产www精品| 亚洲aⅴ日韩av电影在线观看| 欧美激情精品久久久久久久变态| 日韩成人av在线播放| 亚洲欧洲免费视频| 欧美—级a级欧美特级ar全黄| 国产精品一区二区久久精品| 日本精品久久久久影院| 欧美日韩亚洲天堂| 国产午夜精品一区理论片飘花| 黑人巨大精品欧美一区免费视频| 日韩经典中文字幕在线观看| 久久亚洲成人精品| 国产成人在线视频| 亚洲永久在线观看| 亚洲xxxx在线| 亚洲精品视频在线观看视频| 久久久国产一区二区三区| 国产一区二区久久精品| 性色av一区二区咪爱| 国产福利精品视频| 国产性色av一区二区| 欧美色视频日本高清在线观看| 亚洲精品久久久久久久久久久| 中文字幕日韩有码| 亚洲美女精品久久| 精品国产成人在线| 欧美成人精品三级在线观看| 国产成人精品一区二区三区| 国产一区二区三区18| 国产一区二区三区在线观看视频| 色先锋资源久久综合5566| 亚洲二区在线播放视频| 久久久成人精品| 日韩在线视频观看正片免费网站| 欧美电影电视剧在线观看| 97成人精品区在线播放| 成人黄色在线免费| y97精品国产97久久久久久| 欧美视频免费在线| 全亚洲最色的网站在线观看| 欧美成人黑人xx视频免费观看| 亚洲国产精品va在线看黑人| 久久综合色影院| 欧美限制级电影在线观看| 中文字幕视频在线免费欧美日韩综合在线看| 欧美电影在线观看| 亚洲天堂av综合网| 日韩欧中文字幕| 91日本在线视频| 久热精品视频在线免费观看| 亚洲一区二区在线| 亚洲女人初尝黑人巨大| 欧美一性一乱一交一视频| 亚洲深夜福利网站| 午夜精品一区二区三区av| 亚洲xxxx3d| 日韩成人小视频| 亚洲精品乱码久久久久久按摩观| 成人黄色在线观看| 一区二区三区无码高清视频| 亚洲自拍偷拍色图| 69影院欧美专区视频| 欧美在线观看日本一区| 欧美午夜久久久| 日本久久久久久久久久久| 国产日韩在线观看av| 亚洲女人天堂成人av在线| 日本精品久久久| 热99久久精品| 国产z一区二区三区| 国产亚洲精品久久久| 国产小视频91| 日韩精品在线免费观看| 欧美一级电影久久| 成人写真福利网| 国产日产欧美精品| 国产成人精品视频在线观看| 日韩中文字幕免费视频| 日韩美女中文字幕| 欧美日韩不卡合集视频| 亚洲最新av在线网站| 97高清免费视频| 精品视频偷偷看在线观看| 久久久91精品国产一区不卡| 韩国福利视频一区| 日本三级韩国三级久久| 久久久女女女女999久久| 精品亚洲夜色av98在线观看| 国产精品69av| 成人免费视频网| 精品呦交小u女在线| 成人中心免费视频| 中文字幕欧美精品日韩中文字幕| 国产精品久久久久影院日本| 性色av一区二区三区免费| 庆余年2免费日韩剧观看大牛| 欧美激情在线有限公司| 欧美老少做受xxxx高潮| 午夜精品视频在线| 欧美日韩裸体免费视频| 国产成人高潮免费观看精品| 国产精品亚洲第一区| 亚洲第一网中文字幕| 欧美裸体视频网站| 日韩中文字幕网址| 欧美亚洲在线播放| 亚洲第一页在线| 精品香蕉一区二区三区| 欧美成人精品一区| 欧美性猛交xxxx乱大交蜜桃| 久久综合色88| 欧美精品手机在线| 欧美激情第99页| 亚洲图片制服诱惑| 久久综合网hezyo| 国产精品扒开腿做爽爽爽的视频| 中文字幕久久久av一区| 亚洲性69xxxbbb| 国产精自产拍久久久久久蜜| 日韩欧美在线视频| 国产精品成人av性教育| 51久久精品夜色国产麻豆| 国产成人精品免高潮费视频| 亚洲白虎美女被爆操| 亚洲国产私拍精品国模在线观看| 中文字幕亚洲综合久久筱田步美| 国产精品久久综合av爱欲tv| 一区二区三区无码高清视频| 中文字幕不卡在线视频极品| 成人福利在线视频| 日韩一区二区三区在线播放| 九九视频这里只有精品| 欧美高清视频在线| 国产精品午夜视频| 国产精品爽爽爽爽爽爽在线观看| 久久亚洲精品成人| 欧美性做爰毛片| 欧美亚洲另类在线|