First Journey In WebGL(一)

由于一門課程的需要坪郭,要做一個(gè)三維可視化的presentation个从,想來想去,也就WebGL我還有點(diǎn)感興趣歪沃,于是開始對這一領(lǐng)域的研究嗦锐。這兩天的時(shí)間也算是小有收獲吧。在報(bào)告中我就是打算帶著大家一起從零寫一個(gè)WebGL程序的沪曙,讓所有人也都感受一下這么一個(gè)創(chuàng)作的過程奕污,再分享一下學(xué)習(xí)的經(jīng)驗(yàn)。不過可能時(shí)間不夠液走,就在這寫吧碳默。

three.js

要說玩WebGL怎么可能不說three.js,這可是對WebGL的完美封裝缘眶。源碼官網(wǎng)嘱根,要學(xué)three.js這兩個(gè)地方是必去之處。我簡單說一下three.js起步巷懈。

在進(jìn)行開發(fā)之前

由于我們最終的結(jié)果是要呈現(xiàn)在web端该抒,所有在在前端的展示框架要先搭建好,同時(shí)還要事先下載three.js文件顶燕,或者就像我這里一樣凑保,用three.js的官方cdn冈爹。

<html>
    <head>
        <title>My first Three.js app</title>
        <style>canvas { width: 100%; height: 100% }</style>
    </head>
    <body>
        <script src="https://rawgithub.com/mrdoob/three.js/master/build/three.js"></script>
        <script>
            // Our Javascript will go here.
        </script>
    </body>
</html>

創(chuàng)建場景(scene)

用three.js呈現(xiàn)的內(nèi)容需要3樣元算:scene, camera, renderer .

var scene = new THREE.Scene();
var camera = new THREE.PerspectiveCamera( 75, window.innerWidth / window.innerHeight, 0.1, 1000 );

var renderer = new THREE.WebGLRenderer();
renderer.setSize( window.innerWidth, window.innerHeight );
document.body.appendChild( renderer.domElement );

解釋一下,這里的camera欧引,我們使用的是PerspectiveCamera(three.js還提供了很多其他類型的camera以供選擇)犯助,它有4個(gè)參數(shù),第一個(gè)表示視野大形獭剂买;第二個(gè)表示成像比例,一般都是按照瀏覽器窗口比例來進(jìn)行設(shè)定癌蓖;第三和第四個(gè)分別是最遠(yuǎn)和最近的camera作用范圍瞬哼。下面的renderer比較容易理解,需要注意的是在最后要append到document中租副。

下面創(chuàng)建一個(gè)物體出來坐慰。

var geometry = new THREE.CubeGeometry(1,1,1);
var material = new THREE.MeshBasicMaterial( { color: 0x00ff00 } );
var cube = new THREE.Mesh( geometry, material );
scene.add( cube );

camera.position.z = 5;

這里CubeGeometry為了創(chuàng)建一個(gè)cube出來,由geometry變量存儲用僧。除此之外還有需要material給我們的cube著色(同樣的three.js由很多material可供選擇)结胀。然后就是mesh了,這個(gè)過程可以抽象的理解為融合過程责循,有了geometry和material融合后就是我們需要的最終object了糟港。最后把物體add進(jìn)之前聲明好的scene中去。

渲染(render)

function render() {
    requestAnimationFrame(render);
    renderer.render(scene, camera);
}
render();

如果要深入解釋render的原理院仿,這就是另外一本書的內(nèi)容了秸抚。。歹垫。這里剥汤,瀏覽器接到指令后,大概會做的事情就是每秒對要顯示的內(nèi)容進(jìn)行60次著色排惨。

制作動(dòng)畫效果

如果渲染出的圖像不會動(dòng)吭敢,可能也看不出三維效果來。因?yàn)槲覀冇玫闹皇且粋€(gè)生成的簡單cube暮芭,本身是沒有辦法呈現(xiàn)出立體感的鹿驼。所以我們加點(diǎn)動(dòng)態(tài)以展示出,我們做的確實(shí)一個(gè)三維的object谴麦。

cube.rotation.x += 0.1;
cube.rotation.y += 0.1;

最終代碼展示

<html>
    <head>
        <title>My first Three.js app</title>
        <style>canvas { width: 100%; height: 100% }</style>
    </head>
    <body>
        <script src="three.min.js"></script>
        <script>
            var scene = new THREE.Scene();
            var camera = new THREE.PerspectiveCamera(75, window.innerWidth/window.innerHeight, 0.1, 1000);

            var renderer = new THREE.WebGLRenderer();
            renderer.setSize(window.innerWidth, window.innerHeight);
            document.body.appendChild(renderer.domElement);

            var geometry = new THREE.CubeGeometry(1,1,1);
            var material = new THREE.MeshBasicMaterial({color: 0x00ff00});
            var cube = new THREE.Mesh(geometry, material);
            scene.add(cube);

            camera.position.z = 5;

            var render = function () {
                requestAnimationFrame(render);

                cube.rotation.x += 0.1;
                cube.rotation.y += 0.1;

                renderer.render(scene, camera);
            };

            render();
        </script>
    </body>
</html>

這次先寫這么多蠢沿,下次介紹怎么再一個(gè)WebGL程序中l(wèi)oad一個(gè)外部obj模型。哈哈匾效,給力的實(shí)例來了舷蟀。。。


愛生活野宜,愛技術(shù)扫步。
愿結(jié)識各路小伙伴。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末匈子,一起剝皮案震驚了整個(gè)濱河市河胎,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌虎敦,老刑警劉巖游岳,帶你破解...
    沈念sama閱讀 219,270評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異其徙,居然都是意外死亡胚迫,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,489評論 3 395
  • 文/潘曉璐 我一進(jìn)店門唾那,熙熙樓的掌柜王于貴愁眉苦臉地迎上來访锻,“玉大人,你說我怎么就攤上這事闹获∑谌” “怎么了?”我有些...
    開封第一講書人閱讀 165,630評論 0 356
  • 文/不壞的土叔 我叫張陵避诽,是天一觀的道長龟虎。 經(jīng)常有香客問我,道長茎用,這世上最難降的妖魔是什么遣总? 我笑而不...
    開封第一講書人閱讀 58,906評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮轨功,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘容达。我一直安慰自己古涧,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,928評論 6 392
  • 文/花漫 我一把揭開白布花盐。 她就那樣靜靜地躺著羡滑,像睡著了一般。 火紅的嫁衣襯著肌膚如雪算芯。 梳的紋絲不亂的頭發(fā)上柒昏,一...
    開封第一講書人閱讀 51,718評論 1 305
  • 那天,我揣著相機(jī)與錄音熙揍,去河邊找鬼职祷。 笑死,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的有梆。 我是一名探鬼主播是尖,決...
    沈念sama閱讀 40,442評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼泥耀!你這毒婦竟也來了饺汹?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,345評論 0 276
  • 序言:老撾萬榮一對情侶失蹤痰催,失蹤者是張志新(化名)和其女友劉穎兜辞,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體夸溶,經(jīng)...
    沈念sama閱讀 45,802評論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡逸吵,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,984評論 3 337
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了蜘醋。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片胁塞。...
    茶點(diǎn)故事閱讀 40,117評論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖压语,靈堂內(nèi)的尸體忽然破棺而出啸罢,到底是詐尸還是另有隱情,我是刑警寧澤胎食,帶...
    沈念sama閱讀 35,810評論 5 346
  • 正文 年R本政府宣布扰才,位于F島的核電站,受9級特大地震影響厕怜,放射性物質(zhì)發(fā)生泄漏衩匣。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,462評論 3 331
  • 文/蒙蒙 一粥航、第九天 我趴在偏房一處隱蔽的房頂上張望琅捏。 院中可真熱鬧,春花似錦递雀、人聲如沸柄延。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,011評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽搜吧。三九已至,卻和暖如春杨凑,著一層夾襖步出監(jiān)牢的瞬間滤奈,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,139評論 1 272
  • 我被黑心中介騙來泰國打工撩满, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留蜒程,地道東北人绅你。 一個(gè)月前我還...
    沈念sama閱讀 48,377評論 3 373
  • 正文 我出身青樓,卻偏偏與公主長得像搞糕,于是被迫代替她去往敵國和親勇吊。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,060評論 2 355

推薦閱讀更多精彩內(nèi)容