WebGL入門demo

WebGL入門demo

three.js入門

開場白

哇哦粘招,繪制氣球耶啥寇,在網頁上?對叭髟辑甜!厲害了!3D效果圖也能在網頁上繪制出來啊逊笆,這么好玩的事情栈戳,趕緊來看看!

這里是屬于WebGL的應用难裆,webGL可以讓我們在canvas上實現3D效果子檀。而three.js是一款webGL框架,由于其易用性被廣泛應用乃戈。如果要學習webGL褂痰,拋棄那些復雜的原生接口從這款框架入手是一個不錯的選擇。跟著我一起走症虑!

??:three.js參考文檔 英文

??:three.js參考文檔 中文

看地球咯缩歪!

哈哈,別說了谍憔。先看地球:

GIF1.gif

怎么畫匪蝙?

首先要理清邏輯。three.js框架是個法寶习贫,要畫東西的工具逛球,模塊,材料等等里面都有苫昌,找到API去用颤绕。所以,我們只需要:

  • 一張圖片,也就是包裹地球身體的那張圖片奥务,
  • 一個球模型物独,
  • 把圖片貼到球模型上去,地球就出來了氯葬,
  • 再給球加上一些動畫效果挡篓,完工!

開始畫溢谤!

上面講完了畫的大致流程瞻凤,現在要開始畫了。但是你還需要知道世杀,不止這么簡單!遠不止這么簡單肝集!你需要:

1.設置three.js渲染器-renderer

2.設置攝像機camera

3.設置場景scene br>

4.設置物體object-地球

5.設置組織者

是不是一臉懵逼瞻坝?別怕,來講個故事??

其實杏瞻,就是拍電影啦所刀。需要相機,演員(這里是地球)捞挥,場景(scene)浮创,導演(group)。導演組織這些活動砌函,導演也要看場景的斩披,他受場景的約束,演員也要聽導演的讹俊。最后拍好了戲交給渲染器(renderer)來制片垦沉,發(fā)布。

好吧仍劈,這么形象估計懂了厕倍,來,我們具體來講講贩疙。

一步步畫:

每個元素都是再定義了之后讹弯,在初始化函數內部執(zhí)行。

做準備:

用到three.js框架这溅,要先引入以下:

<script src="https://threejs.org/build/three.js"></script>
<script src="https://threejs.org/examples/js/renderers/Projector.js"></script>
<script src="https://threejs.org/examples/js/renderers/CanvasRenderer.js"></script>
<script src="https://threejs.org/examples/js/libs/stats.min.js"></script>

畫地球:

看代碼:

// 加載材質
var loader = new THREE.TextureLoader();
    loader.load('https://threejs.org/examples/textures/land_ocean_ice_cloud_2048.jpg',
     function(texture) {
        //畫球體 形狀
        var geometry = new THREE.SphereGeometry(200, 20, 20);
        // 貼圖 材質紋理
        var material = new THREE.MeshBasicMaterial({
            map: texture,
            overdraw: 0.5
        })
        // 地球
        var mesh = new THREE.Mesh(geometry, material);
        group.add(mesh);
        }

畫地球需要地球外面那張圖片组民,還需要球模型geometry。圖片需要裁剪之后變成material芍躏。再用這兩個元素來new地球mesh,把地球交給group.

設置場景:

var scene;
scene = new THREE.Scene();
scene.add(group);

設置分組(導演):

var group;
group = new THREE.Group();

設置相機:

var camera邪乍;
// 準備好鏡頭
    camera = new THREE.PerspectiveCamera(60, window.innerWidth/window.innerHeight,1,2000);//相機擺上 設置相機擺放位置 產生鏡頭
    camera.position.z = 500;//拍的景物離我500px

先設置一下相機,把他放到里面去。

設置渲染器:

var renderer;
renderer = new THREE.CanvasRenderer();
        renderer.setClearColor(0xffffff);//設置canvas背景顏色
        renderer.setPixelRatio(window.devicePixelRatio);
        renderer.setSize(window.innerWidth, window.innerHeight);//container展示的大小
        container.appendChild(renderer.domElement)//追加 【canvas】 元素到 【container】 元素中
        stats = new Stats();
        container.appendChild(stats.dom);

先設置一下渲染器庇楞,設置在畫布上面顯示的屬性榜配,再把畫布添加到瀏覽器頁面上面去。還有在動畫過程中的循環(huán)渲染在下面講解吕晌。

加動畫啦蛋褥!

var container,stas;
var mouseX=0,mouseY=0;
var windowHalfX=window.innerWidth/2;
var windowHalfY=window.innerHeight/2;
animate();
document.addEventListener('mousemove', onDocumentMouseMove, false);//用鼠標拖
window.addEventListener('resize',onWindowResize,false);

function onDocumentMouseMove (event) {
    mouseX = event.clientX - windowHalfX;//鼠標基于中心點的偏移量;
    mouseY = event.clientY - windowHalfY;//鼠標基于中心點的偏移量睛驳;
}

function onWindowResize (event) {
    windowHalfX = window.innerWidth / 2;
    windowHalfY = window.innerHeight / 2;
    camera.aspect = window.innerWidth / window.innerHeight;
    camera.updateProjectionMatrix();
    renderer.setSize(window.innerWidth,window.innerHeight);
}

function animate () {
// 每秒60針遞歸調用 使地球旋轉
    requestAnimationFrame(animate);
    render();
    stats.update();
}
function render () {
    camera.position.x
     += (mouseX-camera.position.x)*0.05;//在x軸上烙心,相機根據鼠標的位置移動來移動的距離
    camera.position.y 
    += (-mouseY - camera.position.y)*0.05;//在y軸上,相機根據鼠標的位置移動來移動的距離
    camera.lookAt(scene.position);//設置視野的中心坐標
    group.rotation.y -= 0.005;//讓它饒著y軸旋轉 (間接的得到旋轉的速度)
    renderer.render(scene, camera);//將webgl視圖往外輸出
}

設置在鼠標動的時候監(jiān)聽到乏沸,而且此時camera隨即改變而改變淫茵。camera要改變根據鼠標的移動來移動它的距離在函數onDocumentMouseMove中得到,而且地球要有一種遠小近大的感覺蹬跃。隨著鼠標移動匙瘪,camera變化,地球的大小也在改變蝶缀,也就是前面說的遠小近大的感覺丹喻。在函數onWindowResize中實現。然后地球要動畫起來要調用animate函數翁都,每秒60針遞歸調用 使地球旋轉碍论,然后render函數就一直在不停的循環(huán)。狀態(tài)也在不停的更新柄慰。

小結:

WebGL是是一種3D繪圖標準鳍悠,這種繪圖技術里面用了JavaScript,所以會JavaScript先煎,走遍天下都不怕啊??

??:源碼

思考好邏輯贼涩,就可以動手的!好玩就要去嘗試,就在慢慢成長薯蝎。大家共同進步吧遥倦!

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市占锯,隨后出現的幾起案子袒哥,更是在濱河造成了極大的恐慌,老刑警劉巖消略,帶你破解...
    沈念sama閱讀 218,607評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件堡称,死亡現場離奇詭異,居然都是意外死亡艺演,警方通過查閱死者的電腦和手機却紧,發(fā)現死者居然都...
    沈念sama閱讀 93,239評論 3 395
  • 文/潘曉璐 我一進店門桐臊,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人晓殊,你說我怎么就攤上這事断凶。” “怎么了巫俺?”我有些...
    開封第一講書人閱讀 164,960評論 0 355
  • 文/不壞的土叔 我叫張陵认烁,是天一觀的道長。 經常有香客問我介汹,道長却嗡,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,750評論 1 294
  • 正文 為了忘掉前任嘹承,我火速辦了婚禮窗价,結果婚禮上,老公的妹妹穿的比我還像新娘赶撰。我一直安慰自己舌镶,他們只是感情好,可當我...
    茶點故事閱讀 67,764評論 6 392
  • 文/花漫 我一把揭開白布豪娜。 她就那樣靜靜地躺著,像睡著了一般哟楷。 火紅的嫁衣襯著肌膚如雪瘤载。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,604評論 1 305
  • 那天卖擅,我揣著相機與錄音鸣奔,去河邊找鬼。 笑死惩阶,一個胖子當著我的面吹牛挎狸,可吹牛的內容都是我干的。 我是一名探鬼主播断楷,決...
    沈念sama閱讀 40,347評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼锨匆,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了冬筒?” 一聲冷哼從身側響起恐锣,我...
    開封第一講書人閱讀 39,253評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎舞痰,沒想到半個月后土榴,有當地人在樹林里發(fā)現了一具尸體,經...
    沈念sama閱讀 45,702評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡响牛,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,893評論 3 336
  • 正文 我和宋清朗相戀三年玷禽,在試婚紗的時候發(fā)現自己被綠了赫段。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,015評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡矢赁,死狀恐怖糯笙,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情坯台,我是刑警寧澤炬丸,帶...
    沈念sama閱讀 35,734評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站蜒蕾,受9級特大地震影響稠炬,放射性物質發(fā)生泄漏。R本人自食惡果不足惜咪啡,卻給世界環(huán)境...
    茶點故事閱讀 41,352評論 3 330
  • 文/蒙蒙 一首启、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧撤摸,春花似錦毅桃、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,934評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至衫嵌,卻和暖如春读宙,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背楔绞。 一陣腳步聲響...
    開封第一講書人閱讀 33,052評論 1 270
  • 我被黑心中介騙來泰國打工结闸, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人酒朵。 一個月前我還...
    沈念sama閱讀 48,216評論 3 371
  • 正文 我出身青樓桦锄,卻偏偏與公主長得像,于是被迫代替她去往敵國和親蔫耽。 傳聞我的和親對象是個殘疾皇子结耀,可洞房花燭夜當晚...
    茶點故事閱讀 44,969評論 2 355

推薦閱讀更多精彩內容

  • 本文主要是講解 Three.js 的相關概念,幫助大家對 Three.js 以及相關知識形成比較完整的理解针肥。今年來...
    Simon王小白閱讀 8,450評論 2 9
  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,152評論 25 707
  • 人其實挺奇怪的饼记,有的時候明明不喜歡做一件事但是卻也礙于情面勉強做了,心中抱怨著慰枕,嘴里卻說“沒關系啊不客氣啊咱倆啥關...
    溯沼滄滄閱讀 202評論 0 0
  • 我知道我快死了具则,就在不久后的某天,也許就在今晚具帮,我的牙齒很脆博肋,我的皮膚也是脆的低斋,我的胃從未有過的舒服,還有匪凡,我嘎嘣...
    碧落_7113閱讀 359評論 0 2