Warning: error_log(/data/www/wwwroot/hmttv.cn/caches/error_log.php): failed to open stream: Permission denied in /data/www/wwwroot/hmttv.cn/phpcms/libs/functions/global.func.php on line 537 Warning: error_log(/data/www/wwwroot/hmttv.cn/caches/error_log.php): failed to open stream: Permission denied in /data/www/wwwroot/hmttv.cn/phpcms/libs/functions/global.func.php on line 537
覽器和 JavaScript 的功能逐年不斷的變強變大。曾幾何時,任何類型的游戲都需要Flash。但隨著 HTML5 發展,HTML5 + WebGL 游戲式就慢慢占領著這個舞臺。以下是30款流行的游戲,它們可以在所有現代瀏覽器中運行,并且只使用web技術構建。
地址:http://hexgl.bkcore.com/
類型:街機,賽車
HexGL 是一款基于HTML5,JavaScript和WebGL的快節奏的賽車游戲。玩家可以使用鍵盤,觸摸屏設備或leap motion(體感控制器)來控制太空飛船。
地址:http://www.cross-code.com/en/home
類型:動作,角色扮演
一個復古靈感的2D游戲設定在遙遠的未來。這是一個充滿偉大的游戲機制,如組合,拼圖,技能樹,任務,物品等等。
地址:https://sketch-out.appspot.com/
類型:街機
Sketchout的任務保護你的行星,并通過改變流星的方向來消滅對手,通過使流星偏轉來保護您的星球并消滅對方,這款游戲有很棒的視覺效果和音樂特效。
地址:http://www.treasurearena.com/類型:多人,角色扮演,動作
Treasure Arena 是一款動態的競技場戰斗游戲,最多可容納4名玩家。它具有不同的游戲模式,出色的幀率和配樂,是一個非常有趣的游戲。
地址:http://bejeweled.popcap.com/html5/
類型:街機,解謎,娛樂
HTML5格式的經典“寶石迷陣”游戲。這是一個官方克隆,因此可以正常運行且外觀完美。
地址:http://missile-game.bwhmather.com/類型:街機
這是一款非常具有挑戰性的游戲,游戲中我們扮演的是一枚被發射進隧道的導彈。游戲有很酷的黑白圖像,玩的時候會有很強的場景效果。
地址:http://www.deconstructeam.com/games/gods-will-be-watching/類型:拼圖
在這個令人毛骨悚然(但又很棒)的游戲中,我和自己團隊必須獨自生存40天。團隊有六名成員,其中包括一只狗,一名精神病醫生和一個機器人,您必須與他們互動,以使其保持溫暖,溫飽和理智的狀態。
地址:http://www.sinuousgame.com/類型:街機
一個簡單的游戲,極簡的圖形和流暢的幀率。拾取電源時避免與紅點碰撞。此外,如果你想要那些額外的積分,就需要不停向前移動
地址:http://swooop.playcanvas.com/類型:街機
在一個美麗多彩的3D世界里,到處飛翔,收集寶石和星星。
地址:http://www.freeriderhd.com/
Free Rider HD 是一款令人上癮的游戲,你可以在其他玩家繪制的賽道上騎自行車??梢栽诔汕先f的播放器曲目中選擇一個播放,也可以創建自己的曲目并分享。
地址:http://entanglement.gopherwoodstudios.com/zh-CN-index.html類型:拼圖,娛樂
這個游戲的目的是通過在網格上放置線段來創建一條盡可能長的路徑。你可以單獨玩,也可以和朋友一起玩。
地址:https://www.modern.ie/en-us/ie6countdown#escape-from-xp
類型:動作,街機
用“Escape from XP”來慶祝 Windows XP 的終結。你的任務是拯救最后一個陷入Clippy暴政的開發人員。
地址:http://polycraftgame.com/類型:角色扮演,塔防,動作
在這個很棒的3D游戲中,你到處收集資源,建造東西,完成任務。關于它的所有東西都經過拋光,并且運行也非常順暢。
地址:https://gabrielecirulli.github.io/2048/類型:拼圖
一個非常上癮的游戲,你可能已經玩過了。在 2048 ,你移動編號的圖塊并合并它們。當界面中最大數字是`2048 時,游戲勝利。
地址:http://arcade.lostdecadegames.com/onslaught_arena/
類型:動作
一種快節奏的復古生存游戲,您可以使用不同的武器與成群的敵人作戰。
地址:http://chrome.angrybirds.com/類型:游戲
《憤怒的小鳥》游戲,這就不用介紹了。
地址:https://www.cubeslam.com/mcycrs
類型:街機,多人
具有豐富的色彩和炫酷的3D圖形乒乓球游戲。我們可以通過向朋友發送一個URL來挑戰他們,還可以通過網絡攝像頭看到對方。
地址:http://hypnoticowl.com/games/the-wizard/類型:動作,角色扮演,策略
Wizard 是基于回合的地牢爬行者,在里面會遇到神話般的怪物并找到奇妙的咒語。該游戲具有酷炫的戰斗機制,有時可能會帶來很大挑戰。
地址:http://phoboslab.org/xtype/類型:動作,街機
在這款酷炫的太空射擊游戲中,你目的就是要起戰勝 Boss。
地址:http://orteil.dashnet.org/cookieclicker/類型:休閑,搞笑
Cookie clicker 是一款可能為了開玩笑而創建的游戲,但仍然提供了大量的樂趣。你可以從0個cookie開始,然后單擊一些有效率的cookie,最后你可能會發現自己擁有數十億個cookie。
地址:http://play.elevatorsaga.com/類型:拼圖,編碼
這類屬于程序員類型游戲 。在電梯中的任務是通過對電梯的運動進行編程,以最有效的方式運送人員,這些都是用 JavaScript 來完成的。
地址:http://gameofbombs.com/landing類型:動作,角色扮演,多人
Game of Bombs是一個轟炸機類型的游戲,在廣闊地圖上,都有著敵方玩家。收集力量,皮膚和成就,以成為最佳轟炸機玩家的方式。
地址:http://or.paleozoic.com/類型:平臺游戲,動作
Olympia Rising具有漂亮復古外觀圖形的游戲。它坐落在古希臘,在那里我們扮演的女人被賦予了重新的機會,所以我們的任務就是逃離死者的世界。
地址: https://ned.im/pixel-race-game/類型:街機,賽車
Pixel Race是一款簡單概念概念,你可以在收集硬幣的同時控制汽車以避開障礙物。如果有足夠的耐心和空閑時間,那么你可能會打破記錄(記錄為36309個硬幣)。
地址:https://littlealchemy.com/類型:拼圖
從這四個基本元素開始,將它們組合起來,創建510種可能的組合。
地址:http://www.kevs3d.co.uk/dev/arena5/類型:街機
在數字領域中飛行并射擊幾何敵人以獲得高分。
地址:https://vector-runner-remix.tresensa.com/
類型:街機
在這個充滿色彩和幾何形狀的平臺游戲中,盡你所能奔跑吧。
地址:http://playbiolab.com/類型:動作
一款出色的像素藝術平臺游戲,你必須在這里逃脫充滿突變生物和其他不良生物的實驗室。
地址:http://worldsbiggestpacman.com/#類型:街機
地址:http://games.jessefreeman.com/new-super-resident-raver/
從即將到來的僵尸入侵中拯救驚慌失措的人們。收集錢,升級你的武器和戰斗僵尸。
作者:Danny Markov 來源:tutorialzin 譯者:前端小智
原文:https://tutorialzine.com/2015/02/30-amazing-games-made-only-with-html5
言
25年過去了,Brooks博士著名的“沒有銀彈”的論斷依舊沒有被打破。HTML5也是一樣。但這并不妨礙HTML5是一個越來越有威力的“炸蛋”:發展迅速、勢不可擋。隨著HTML5技術的普及,用HTML5做可視化呈現的項目越來越多了。HTML5的優勢明顯:網頁上直接運行無需插件、手機平板方便兼容、代碼開發和維護相對容易,等等。一大波一大波的做Java、.NET甚至C++桌面的程序老手們都紛紛開始研究javascript了,而初出茅廬的新一代程序猿更是義無反顧的直奔HTML5這個技術大熱點而來。
HTML5涵蓋的技術點很多,甚至延伸到了前端、后端、通訊等各個層面。前端的canvas繪圖這塊無疑是它的核心內容。Canvas的API雖然不是很復雜很強大,但是做一般的2d繪圖基本都夠用了。基于這些API,一大堆的2d繪圖組件紛紛出爐。Echarts、d3.js都是很不錯的項目。 Echarts主要是chart組件,而d3相對雜一些,很多呈現方式很有創意,值得研究。
概述
研究d3的起因是最近有一個項目,用戶截了一張效果圖讓我們用HTML5做一下:
看著很眼熟,搜了一下,感覺就是d3例子中的sunburst效果,程序在這里:
http://bl.ocks.org/mbostock/4063423
看上去似乎也不難,就是一圈一圈的餅圖,把樹狀結構數據按占比一層一層繪制上去就行了。所以引起了自己動手做一個的興趣?!皊unburst”英文里應該是“云開日出”的意思,類似強烈的光芒從云層背后透射出來,不知為何中文里大多把它翻譯成“日落”。比如這把Fender Telecaster吉他型號是Brown Sunburst款,就會被大家翻譯成“日落色”。
關于日出和日落更喜歡哪一個的問題,網上還真有這樣的調查。有意思的是,選擇喜歡日落的遠多于選擇日出的。日出代表希望,日落代表成熟,都是一種美,哪個更美要看你個人的心境,因為它的美麗是由心生。為了不在這個問題上站錯對,我們還是給他重新起一個更加響亮霸氣的中文名字:“彩虹爆炸圖”,怎么樣?
仔細研究一下彩虹爆炸圖的結構,無非就是一個樹形結構,并采用發射狀的布局。根節點在中間(也可以認為沒有唯一的根,而是一堆根節點圍繞在第一圈),一次向外發散排列。每一個節點有名稱、數值。節點可以按照自身數值在扇區所占比例進行繪制,這樣就不用管節點具體數值有多大多小了。
這種圖最先是由布朗大學教授John T. Stasko設計。
http://www.cc.gatech.edu/~john.stasko/
經過一天的折騰,終于做出了一個還算過得去的“彩虹爆炸圖”。先上個圖看看:
主要功能包括了:
可以通過json來定義數據和樣式(類似百度的echarts那樣);
顏色可以固定,也可以自動彩虹色;
自動計算數值及角度占比;
動態顯示導航路徑;
鼠標動態高亮顯示路徑;
動畫飛入、展開導航路徑;
文字顯示及角度控制;
全矢量,可鼠標縮放、平移,不失真;
下面重點碼一下折騰過程中的幾個重點:
一、定義節點對象
首先定義每一個小扇片節點。每個扇片可以用一段餅圖來繪制。為了簡單方便,這里用了最簡單高效偷懶的方法:用一個半徑很粗的線畫一段角度的arc,即可。如下圖:
另外還有文字等內容。所以定義它的json結構大概如下:
var item={name: '名稱', color: 'red', angle: '45', …};
此外,下一圈的數據,可直接定義為這個節點的“孩子節點”,直接在item中定義一個data的子節點數據:
var item={name: '名稱', color: 'red', angle: '45', data:[
{name:’孩子一’, color:’green’,…},
{name:’孩子二’, color:’yellow’,…},
]};
這樣就可以組成一個樹狀結構。接下來要在canvas上繪制圖形了。為了方便,這里直接使用了矢量圖進行定義:
twaver.Util.registerImage('node', {
v: [{
shape: 'circle',
r: ...
lineColor: function(data,view){return data.getClient("lineColor");},
lineWidth: ...
startAngle: ...
endAngle: ...
},{
shape: 'text',
textBaseline: 'middle',
textAlign: ...
text: ...
x: ...
y: ...
font: ...
fill: ...
rotate: ...
visible: ...
shadow: ...
}],
});
矢量圖中定義了2個圖形元素:一個arc弧線、一個文字對象,分別用于畫node和繪制其文字。顏色、字體、是否可見、陰影、對齊、位置、線寬、角度…等等均在上面的定義中用一個function動態獲取。例如,這個節點的半徑,通過下面的方法,就可以在圖形的lineColor屬性中保存并驅動,需要修改,直接修改lineColor這個client屬性即可,而不用去修改繪圖參數,非常方便:
r:function(data,view){return data.getClient("lineColor");}
這里有一個比較啰嗦的地方是:每個扇片的角度需要根據每個item定義的原始值進行計算角度占比。而且,對于太小的扇片,可以給一定的最小值(例如 1度),保證能視覺上看到它。否則,顯示10000和1兩個數值,由于對比過大,可能就杯具了,因為1連1度都占不到,顯示效果會非常差。還有,每個扇片之間應該盡量留有一定的空隙。如果連續繪制,就會連成一片,沒有“分片”感。這些可以在代碼中進行簡單控制。
二、文字控制
文字控制也比較啰嗦。首先是對齊方式。最簡單的方式當然是讓文字在所在扇片處,直接居中、旋轉。這樣文字會在徑向的中間位置,如下圖:
但這樣顯示感覺并不是很完美。對于中文來說,如果能統一靠近圓心方向的位置對齊,會更好看一些。這樣,即使文字過長,也會向外延伸,不會和里面的重疊。如下圖:
還有,當文字在左半圓時,如果不做特殊處理,文字旋轉會導致文字大頭朝下,閱讀起來有把脖子歪斷的風險。所以應該動態判斷,如果文字在左側,應該文字再增加旋轉180度。同時左側的文字對齊也要特殊考慮,應該變成右對齊,才能保持徑向的整齊一致。
文字還有一個細節就是顏色和陰影的問題。不使用陰影,單純的使用顏色(例如白色),則在一些方向上的節點的文字會看不清楚,因為我們做的是彩虹爆炸圖,各個方向顏色都不一樣,而且還會隨著圈數增加而變淡顏色,所以幾乎不可能用一個固定的顏色(例如白色或黑色)能保證文字在所有地方都能和node顏色搭配并看清楚。所以思來想去還是使用了陰影效果。
聯想了一下我們看美劇時候的字幕,似乎也是同樣的問題。視頻字幕要顯示在千變萬化的視頻場景里面,視頻場景的顏色完全隨機出現無從知曉,要想讓字幕看清楚,必然也會想一些辦法解決。我們仔細觀察一下視頻字幕:
仔細觀察,字幕是白色文字加了一圈黑色外框,這樣就不怕任何場景了。我們在文字定義時也模擬一下,設置陰影和陰影偏移試一試:
fill:'white',
shadow: {
offsetX: 2,
offsetY: 2,
blur: 4,
color: 'black',
},
看一下使用前和使用后的效果對比:
使用陰影后不但文字更清晰了,而且也增加了立體感,效果還是不錯的。下面圖顯示在應用在節點上的效果:
可見不論什么顏色,都能比較好的勾勒出文字輪廓,保持清晰可讀。
三、生成彩虹顏色
關于顏色,是一個有趣的話題。對于廣大程序猿來說,顏色是一個既簡單又困難的東西。我們隨手就能寫下’red’, ‘green’, ‘orange’, ‘yellow’這樣的色彩斑斕的顏色,還能保證沒有語法錯誤;我們還會寫’#FF55AA’、’#0c0’、’RGB(0,204,0)’、’ RGB(0%,80%,0%)’這樣的各種顏色寫法;我們也明白RGBA的含義和用途。但是,我們很少能把一個demo寫的顏色很好看、很搭配。關于顏色和配色以后再專門討論。這里我們只想自動生成一圈彩虹一樣的顏色。用我們熟悉的RGB方法好像比較困難了。于是想起了那個HSV的顏色定義方法,它貌似很適合解決這個問題。
HSV顏色模型定義了色調H、飽和度S和亮度V,由A. R. Smith在1978年創建的一種顏色空間。其中H用一圈360度表示所有顏色,從紅色開始按逆時針方向計算,紅色為0度。飽和度S從0到1,越大越飽和。亮度V從0到255(也可以轉換為從0到1,方便使用),越大越明亮,越小越暗淡。
Js里面并沒有直接處理HSV顏色的函數。不過用下面的代碼很方便可以從hsv轉為rgb:
寫一個對應的js函數也很簡單:
/* h, s, v (0 ~ 1) */
function getHSVColor(h, s, v) {
var r, g, b, i, f, p, q, t;
if (h && s===undefined && v===undefined) {
s=h.s, v=h.v, h=h.h;
}
i=Math.floor(h * 6);
f=h * 6 - i;
p=v * (1 - s);
q=v * (1 - f * s);
t=v * (1 - (1 - f) * s);
switch (i % 6) {
case 0: r=v, g=t, b=p; break;
case 1: r=q, g=v, b=p; break;
case 2: r=p, g=v, b=t; break;
case 3: r=p, g=q, b=v; break;
case 4: r=t, g=p, b=v; break;
case 5: r=v, g=p, b=q; break;
}
var rgb='#'+toHex(r * 255)+toHex(g * 255)+toHex(b * 255);
return rgb;
}
再回到我們的彩虹爆炸圖。每一個節點對應的所在角度(中心角度)決定了它自己的顏色值。所以,我們可以直接根據這個角度得到顏色的h。然后,為了讓彩虹逐漸一圈一圈變淡,再把s飽和度從1逐圈遞減(例如0.1),產生變淡的效果。為了防止圈太多最后看不清,減到0.2到0.3左右可以停止遞減。
var fromAngle=node.getClient(‘fromAngle’);
var toAngle=node.getClient(‘toAngle’);
var level=node.getClient(‘level’);//節點在第幾圈
var h=(fromAngle+to)/2 % 360 /360; //中心角度,并轉換為弧度
var s=Math.max(0.2, 1-level*0.1);//每圈s遞減0.1,直到0.2為止
var v=1;
var color=getHSVColor(h, s, v);
這樣就獲得了一圈顏色。實驗效果如下:
如果相對某個節點的顏色做特殊處理,例如強制為橙色來凸顯,我們可以在數據中定義時加個標記,設置顏色時候直接使用而不用計算即可。
{name:'浦東新區', value: 2600, color: '#FE9A2E'}
接下來要實現鼠標劃過節點,自動計算路徑、高亮路徑節點、暗淡非路徑節點。為了方便路徑尋找,程序把每個節點的下一圈子數據定義為子節點,子節點通過getParent函數可以直接獲得父對象。這樣,通過不斷getParent就可以獲得整個路徑上的節點,并修改其顏色為預設顏色,實現高亮效果:
var node=highlightedNode;
while(node){
node.setClient(‘color’, node.getClient(‘color.original’));
node=node.getParent;
}
對于非路徑節點的顏色,可以設置為預設顏色但飽和度為0.1的淡顏色 ,讓它變淡,以便突出高亮路徑:
var color=getHSVColor(h, 0.1, v);
node.setClient(‘color’, color);
四、動畫效果
最后,為了圖形更生動,使用了一些動畫效果。首先想到的就是圖形出來時候,用動畫從小到大發散開來,會很動感。這樣做需要用動畫函數來驅動每一個節點的半徑位置,從0增加到所在的半徑位置,如果大家一起設置,整個圖就會動起來。這里用了一個動畫函數來驅動,并使用了網上常用的easing函數來控制,避免線性的動畫太死板:
new Animate({
from: 0,
to: 1,
dur: 3000+level*100,
easing: 'elasticOut',
onUpdate: function (value) {
node.setLocation('pie.location’, value);
},
}).play;
上面定義的動畫,用3秒鐘跑完,用'elasticOut'的easing方式。每一幀,修改node的位置信息。這樣就完成了橡皮筋一樣的環形彈出散開效果。
另外,導航條的出來也比較突兀,這里也使用一下動畫,讓它從左到右慢慢伸出:
new Animate({
from: {x:x1, y:y1},
to: {x:x2, y:y2},
delay:50,
type: 'point',
dur: 1000,
easing: 'bounceOut',
onUpdate: function (value) {
node.setCenterLocation(value.x, value.y);
和上一個動畫的不同之處在于這里使用了{x、y}的point結構,每一幀直接更新節點位置。同時設置了50毫秒的delay,讓動畫有一點點粘性停滯,不至于太突兀。效果不錯。
至此,彩虹爆炸圖基本上就做的差不多了。使用起來也很簡單,只要準備一些json數據就可以了,下面是一些有趣的數據做出來的效果。感興趣的同學可以到這里索取代碼。
實際應用在項目中的示意圖。如果你也希望項目中用一下彩虹爆炸圖,歡迎給我發郵件索?。篿nfo@servasoft.com
掃推薦微信:中國大數據
推薦理由:一手新鮮,絕對干貨
代瀏覽器都內置了專用動畫技術,Martin G?rner為您展現四種最棒的實例。
現代移動操作系統將用戶接口動畫化,并已達到了電腦端交互的標準——精選流暢的動畫,體現出沉浸效果以及支持直觀的交互。我們都想當然的認為,可以設置一個列表,使之帶有運動特性,用手指輕輕一推,它就如同有重量和慣性一樣運動起來,直到遇到邊緣再反彈回來一點。但是,在網絡上,我們還達不到這樣的效果。
接受事實吧,現有網上的動畫經常被視作UI災難,還在使用二十年前陳舊的<blink>標簽技術。加入Flash有點幫助,不過它缺乏HTML DOM集成,都變成了不美觀的800×600分辨率,并且JavaScript DOM操作還有其標志性的5幀/秒(fps)動畫率——真是絕望?。?/p>
改變
2013年,現代瀏覽器內置了專用動畫技術,達到60 fps。是時候去忘掉過去,開始構建美妙的UI動畫體驗了。我將展示四個動畫技術,幫助你決定,哪一個更適合你的項目。
讓我們從最簡單的聲明式技術開始:CSS3。這里不需要JavaScript,存CSS,加上一點現代手段。
CSS通過兩種基本屬性來聲明動畫:過渡和動畫。過渡屬性通知瀏覽器計算兩種狀態(由各自CSS定義)間的中間幀。動畫通過改變元素CSS觸發。比如,當你以編程方式改變它的層,或啟動一個:hover CSS。
當縮略圖層從開始轉變到結束,圖像則從一處平滑的移動到另一處,典型的表現為JavaScript DOM動作的結果。
img { -webkit-transition: 1s; }.begin { left: 0px; }.end { left: 500px; }
動畫屬性最常用于持續運行的動畫特效,它還允許自定義中間步驟的動畫。
創建一個旋轉的圖像:
img {-webkit-animation: myAnim 3s infinite; }@-webkit-keyframes myAnim{ from {-webkit-transform: rotate(0deg) } 50% {/* possible intermediate positions at any % */} to {-webkit-transform: rotate(360deg) }}
利用大量CSS屬性制作動畫具有無限的創造性,你可以根據意圖在邊框寬度內任意創建動畫。 不過,大多數對動畫有用的屬性都是幾何變換和不透明的。CSS3通過易操作的轉換屬性提供了全系列二維幾何變換:平移、旋轉、縮放和歪斜。
用旋轉、縮放和歪斜創建2D轉換:
webkit-transform:旋轉30度
webkit-transform:縮小50%
webkit-transform:歪斜-20度,再20度
接下來變得有趣了。如果你覺得在CSS中添加3D效果,技術上是為了粗體和斜體的設計,這很愚蠢,請接著閱讀。通過擴展幾何轉換到三維圖像將是一個很自然的方式,相同變換屬性還可以做平移X,Y,Z軸以及旋轉X,Y,Z軸。
3D旋轉圖像:
webkit-transform:Y軸旋轉45度
再加上點拋出動畫效果,看上去就像是一個旋轉的三維立方體。
如果確實這般容易的話,就不會有任何趣味性了。設計師留了一點懸念,你可以試一下,只對一個圖像進行旋轉,瀏覽器默認渲染出來的效果是不帶透視性的:
webkit-transform:Y軸旋轉45度
可以添加上透明屬性,默認是無窮大極限值也是不帶有一點透明效果的。就如同靠近鏡頭的對象與很遠距離外的對象看上去大小一樣。
為了確保圖像看上去更真實,你還需要指定一個鏡頭與屏幕之間距離的值。加上-webkitperspective: 1000px就可以了。
要在一塊平面屏幕上呈現一個3D對象,首先畫出一條線連接眼鏡或相機與3D物理上的點。這條線與屏幕的交集就是相應像素所在的位置。為了找到像素在屏幕上的坐標,利用泰勒斯定理,你需要空間中點的3D坐標和相機與屏幕之間的距離(f在光學中也被稱為焦距)。這就是視角屬性提供的距離。如果這個距離是無限遠的,你可以看到所有射線(眼球到3D點線)是水平緊密狀的,而且很遠很遠的對象在屏幕上的大小一樣。
現在我們有設置一個3D立方體的所有基礎了,利用六個圖像以及CSS 3D轉換,接下來就可以實現旋轉了。
這一步很簡單:我們把一個三維旋轉封裝到一個div,將會產生如下效果:
瀏覽器執行你讓它所做的步驟:在div渲染一個三維立方體,然后像一張平面圖片般在自身運用3D旋轉。這是默認效果,雖然不是你想要的。你要告訴瀏覽器運用嵌套div來構成3D轉換,-webkit-transform-style: preserve-3d屬性。通過這個,我們就能得到想要的旋轉立方體了。
很容易在空間失去定位。我的建議是采用一個div,命名為SCENE。這就是透明屬性存放的位置。在內部,放置一個命名為OBJECT的div,它應當擁有transform-style: preserve-3d屬性,并且該div就是你應用轉換移動整個對象的地方。最后,在該div內部,使用3D轉換設置你想要的正面圖像,創建所需對象。在我們的例子中,立方體的六個面:
.SCENE { -webkit-perspective: 1000px; }.OBJECT{ -webkit-transform-style: preserve-3d; -webkit-transform: rotateX(20deg rotateY(120deg) rotateZ(50deg); /* replace this with an animation property if you want movement */}.FACE1 { -webkit-transform:translateX(150px)rotateY(90deg);}...
關于3D CSS轉換很棒的一點是CSS動畫和過渡的完美結合。我們在這留了一個練習,讓旋轉立方體運動起來,當鼠標光標懸停其上時,立方體自動打開來。操作方法是:把立方體的面移動到與中心一定距離的地方。第二組CSS屬性有一個 :hover選擇器,將立方體的面放置在更遠的距離。通過運用第一種轉換屬性,你將看到立方體從中心盤旋打開,同時還保持旋轉(演示)。
HTML與CSS都是強大的動畫技術,但缺乏繪圖基元。SVG能夠彌補這點,并擁有其獨特的動畫標簽。SVG動畫部分被特定稱為同步多媒體集成語言(SMIL)。
首先,SVG是用于矢量基元的,比如矩形、圓形和貝塞爾曲線:
<svg> <rect x="5" y="5" width="140" height="140" stroke="#000000" strokewidth="4"fill="#AAAAFF" opacity="1"/></svg>
同樣可用于:
<line x1 y1 x2 y2><circle cx cy r><path d><image x y width height xlink:href>
其中一個基元,<path>標簽,是SVG中最好用的。它允許你使用直線、弧和貝塞爾曲線定義任意路徑。路徑定義看上去想一個字母,如同Inkscape矢量圖形軟件生成的。對于SVG動畫,你應該理解這一點。
一個二次和三次貝塞爾曲線的例子:
<svg> <path d="M 30,240 Q 170,40 260,230" stroke="#F00" /> <path d="M 30,240 C 70,90 210,150 260,230" stroke="#F00" /></svg>
語法:
M x,y ? ? 新的起點 (標記)
L x,y ? ? ?到哪里的直線
Q cx, cy, x, y ?二次貝塞爾曲線到 (x,y)和一個控制點
C cx,cy, dx,dy, x,y 三次貝塞爾曲線到(x, y)和兩個控制點
A ? ? ? 橢圓弧
z ? ? ? 字符串最后,用于結束路徑
讓我們把這些矢量變得更生動化。你可以查看演示,一個家伙踏著滑板翱翔于白云間。
沖浪板上下擺動,小人的嘴巴在大和更大的笑容間交替變化,眼睛滾動,瞳孔擴張。這是SVG動畫四種可能的類型。
最簡單的一種SVG動畫運用<animate>標簽,改變一種幾何形狀的一個參數,在本例中,就是眼睛的半徑。
要使瞳孔擴張,需要改變屬性列表值中的半徑值。
<circle cx="200" cy="205" r="80" > <animate dur="3s" attributeName="r" values="80; 150; 80" repeatCount="indefinite" /></circle>
方便的是變化的屬性還可以成為<path>標簽。允許你創建一個動畫路徑。 唯一的限制是兩個曲線之間要進行轉換,必須是同一種類型且擁有相同數量的控制點。它們必須由相同位置上的同一個字母定義,唯一不同的只能是參數的改變。當移動小人的嘴巴時,只有“微笑”和“大笑”位置被定義了。SVG動畫將完成插值。
<path fill="#fff"> <animate attributeName="d" dur="2s" repeatCount="indefinite" values="m 0,0 c 1,15 -13,45 -45,45 -32,0 -44,-28 -44,-44 z; m 0,0 c -4,15 -66,106 -98,106 -32,0 3,-89 9,-105 z" /></path>
當然,SVG還能進行幾何變換,也能做成動畫。這里的動畫標簽是<animate Transform>。你必須告訴它想要將哪里的轉變做成動畫,還要提供一個分號分隔的所有關鍵位置的值列表。還可以組成動畫轉換,你告訴瀏覽器使用additive=”sum” 屬性。
幾何轉換的動畫:
<g> ... <!-- SVG primitives group --> <animateTransform dur="3s" repeatCount="indefinite" additive="sum" attributeName="transform" type="translate" values="0,0; 200,-130; -100,200; 0,0" /> <animateTransform dur="3s" repeatCount="indefinite" additive="sum" attributeName="transform" type="rotate" values="0; 20; -20; 0" /></g>
第三個和最后一個SVG動畫標簽也很有用。<animateMotion>用來引導對象沿著特定路徑運動。 它有一個隱藏的技巧稱為rotate=”auto”屬性。它讓對象不僅能夠遵循指定路徑,同時自身保持朝前,如同路上行駛的車輛一樣。
<g> ... <!-- SVG primitives group --> <animateMotion dur=”1s"repeatCount="indefinite" path="m 0,0 a 15,11 0 1 1 -30,0 15,11 0 1 1 30,0 z" /></g>
SMIL有大量控制動畫特征。在它的JavaScript API中揭露pauseAnimations(), unpauseAnimations()和setCurrentTime(t) 函數在全局性開始/停止/暫停一個動畫的功能。還在所有三種動畫標簽(<animate>, <animateTransform>, <animateMotion>)上指定了begin與end屬性。它們可以利用一個事件節點/用戶事件/動畫事件的強大組合。你可以指定,動畫在點擊之后的一秒結束或開始。
例如,下面這個SVG按鈕被點擊后有一個移動的陰影效果:
<g id="buttonID"> <!-- SVG button artwork here --> <animate begin="buttonID.click" dur="1s"\ .../></g>
由聲明性動畫轉換到編程性動畫技術,<canvas>標簽是你的第一選擇。本文所提到的所有技術中,<canvas>標簽最具有跨瀏覽器支持,瀏覽器廠商做了很多努力使之兼容60fps動畫,以下是設置一個畫布的方法:
<canvas width="400" height="400" style="width: 400px; height: 400px;"></canvas>
第一個尺寸(標簽屬性)設置了畫布的分辨率,這就是你所使用的坐標空間。第二個尺寸(CSS屬性)是畫布出現在屏幕上的形狀大小。為什么不把畫布物理尺寸設置到100%分辨率,內部坐標空間不變,瀏覽器為任意窗口都能正確渲染圖畫?非常遺憾,瀏覽器將畫布內容作為點陣圖來掃描的,任何擴大范圍的結果都將導致模糊混亂的像素。于是,把這兩個值設置成相同的值是唯一可行的選項。
初始化畫布需要JavaScript中<canvas>元素,并在其上調用getContext('2d')函數。獲得的圖畫內容對象被用來調用到畫布API。內容是狀態性的,存儲三種不同的狀態信息:繪畫風格,即時幾何轉換以及累計繪圖路徑。在畫布上進行繪畫的方法是發布繪圖指令,不產生任何可見內容,但在內存中已創建了一個路徑,然后發布一個油墨指令(ctx.stroke(), ctx.fill() 或兩者皆有),就能顯示出路徑了。
畫布動畫需要設置一個動畫循環,你應當基于requestAnimationFrame()函數(帶有正確的前綴)。該函數使瀏覽器能夠管理幀率,在瀏覽器選項卡隱藏時也能停止動畫。
function runAnimation(){ yourWorld.draw() // this is your drawing code webkitRequestAnimationFrame(runAnimation);}
一般來說,畫布被用于動畫的時候,對象的位置必須是在逐幀的基礎上才行,這是因為它們都是物理仿真的結果。觀看box2dweb.js教程。仿真不斷改變仿真世界中對象的位置,動畫循環周期性的在屏幕上展現當前環境狀態。
在畫布動畫中使用SVG精靈是一種很有用的技巧。一個任意復雜性的靜態矢量圖片在畫布上呈現都是繁瑣的,這樣做實際上可行,雖然不如發送一個.svg到 ctx.drawImage()簡單。出于模糊安全的原因,只有內聯SVG支持,你必須在Blob API中使用它(代碼)。
SVG精靈能夠以任意比例展示其矢量美態,但遺憾的是,只支持Chrome瀏覽器。
WebGL暴露瀏覽器運行的JavaScript應用程序OpenGL API,而不需要任何插件。理論上講,你只需要在<canvas> 元素上調用getContext(‘webgl’)(而不是之前的2d)就可以了。然而,WebGL非常大,并且API等級低。最重要的是,web版本沒有默認的渲染路徑,這意味著你無法給它一個形狀,讓它使用適合的默認值展示出來。所以你必須編寫著色器,使用GLSL語言編寫屏幕上出現的任何內容。
幸運的是我們有Three.js幫助。Three最初是由Mr.doob開發的庫,用于一些Chrome演示(www.ro.me/www.chaostoperfection.com),但它是相對獨立的。它擁有所有的基礎,以及內置獨特的著色器,你就可以專注于其他有用的方面:相機、燈光、行動。
首先要做的是編寫Three粘合代碼(很簡單):
var renderer=new THREE.WebGLRenderer({antialias: true});renderer.setSize(width, height);renderer.setClearColorHex(0x000000, 0); // color,transparency// the renderer creates a canvas elementfor youdocument.whereeveryouwant.appendChild(renderer.domElement);
在lights和action之前,需創建camera和位置:
// arguments: FOV,viewAspectRatio, zNear, zFarvar camera=new THREE.PerspectiveCamera(35,width/height, 1, 10000);camera.position.z=300;
然后是light:
var light=new THREE.DirectionalLight(0xffffff, 1);//color, intensitylight.position.set(1, 1, 0.3); // direction
我們試著呈現一個立方體吧,3D對象在Three中被稱為網絡,都由一個幾何體和一個材料構成。
我們使用一個簡單的結構:
var texture=THREE.ImageUtils.loadTexture(‘Fernando Togni.jpg’);var cube=new THREE.Mesh( new THREE.CubeGeometry(100, 100, 100), new THREE.MeshLambertMaterial({map: texture}) );
最后添加內容,稱為渲染函數。
var scene=new THREE.Scene();scene.add(cube);scene.add(light);renderer.render(scene, camera);
這將為我們的立方體產生一個靜態圖像,為了讓它動起來,我們包裹渲染召集一個動畫循環,改變立方體在每一幀的位置。
function runAnimation(t){ // animate your objects depending on time cube.rotation.y=t/1000; cube.position.x=... renderer.render(scene, camera); // display requestAnimationFrame(runAnimation); // and loop}
推薦使用三維建模軟件例如Sketchup。Three識別幾類3D模型結構,包括COLLADA(.dae)具有廣泛行業支撐。下面是如何在Three中加載一個模型:
var loader=new THREE.ColladaLoader();loader.load("Android.dae", function(collada){ var model=collada.scene; model.position=...; // x, y, z model.rotation=...; // x, y, z scene.add(model);} );
再做一些努力,更換機器人外觀花式,Three提供蘭伯特和馮氏照明風格,法線貼圖,凹凸貼圖,環境映射以及更多。
還可以使機器人運動起來,具體步驟參考教程。
原文鏈接:http://www.gbtags.com/gb/share/2124.htm
*請認真填寫需求信息,我們會在24小時內與您取得聯系。