成人无码视频,亚洲精品久久久久av无码,午夜精品久久久久久毛片,亚洲 中文字幕 日韩 无码

資訊專欄INFORMATION COLUMN

threejs構(gòu)建web三維視圖入門教程

Profeel / 1945人閱讀

摘要:本文是一篇簡單的構(gòu)建三維視圖的入門教程,你可以了解到利用創(chuàng)建簡單的三維圖形,并且控制圖形運(yùn)動(dòng)。然后將其加入到中。三創(chuàng)建對(duì)象大多數(shù)時(shí)候,我們需要講繪制的圖形整合到一起進(jìn)行控制。在軸上運(yùn)動(dòng)的完整代碼這個(gè)入門教程就到這里了,感謝閱讀。

本文是一篇簡單的webGL+threejs構(gòu)建web三維視圖的入門教程,你可以了解到利用threejs創(chuàng)建簡單的三維圖形,并且控制圖形運(yùn)動(dòng)。若有不足,歡迎指出。
本文使用的框架是three.js
github地址:https://github.com/mrdoob/three.js,
官網(wǎng):http://threejs.org/,
文檔:http://threejs.org/docs/,

本文中的示例已上傳github,地址:https://github.com/RizzleCi/three.js-demo

一、創(chuàng)建場(chǎng)景

我們所見的視圖由兩個(gè)部分共同創(chuàng)建,scene和camera。
首先定義一個(gè)場(chǎng)景:

var scene = new THREE.Scene();

然后定義一個(gè)相機(jī):

var camera = new THREE.PerspectiveCamera( 90, width/height, 0.1, 1000 );

等等,定義相機(jī)需要視窗的長寬?,F(xiàn)在我要讓我的繪圖顯示在頁面的一個(gè)區(qū)域(

)標(biāo)簽中。我們來選中這個(gè)元素,獲取它的長寬。

var container = document.getElementById("canvasdiv");
var width = canvasdiv.clientWidth;
var height = canvasdiv.clientHeight;

這樣再加上前面的一行代碼,我們就完成了對(duì)相機(jī)的定義。然后把相機(jī)位置設(shè)定在z軸上方便觀察。
camera.position.set(0,0,10)

現(xiàn)在我們需要一個(gè)渲染器把定義好的場(chǎng)景渲染出來。

var renderer = new THREE.WebGLRenderer();

給這個(gè)渲染器合適的大小。

renderer.setSize( width, height );

然后將其加入到dom中。

canvasdiv.appendChild( renderer.domElement );

(運(yùn)行以后發(fā)現(xiàn)這其實(shí)就是一個(gè)canvas元素。其實(shí)我們也可以在html中創(chuàng)建canvas元素再將renderer綁定到它上面。var renderer = new THREE.WebGLRenderer({ canvas: document.getElementById("mainCanvas") });
最后進(jìn)行渲染。

renderer.render(scene,camera);

這樣,就建立了一個(gè)簡單的3d場(chǎng)景。

二、繪制圖形

我將threejs中的物體理解為模型+材料。以一個(gè)長方體為例。
創(chuàng)建模型:

var geometry = new THREE.BoxGeometry( 1,2,1 );

定義材料:

var material = new THREE.MeshBasicMaterial( { color: 0x645d50 } );

有了這兩者,我們就可以構(gòu)建一個(gè)長方體方塊了。

var cube = new THREE.Mesh( geometry, material );

我們將其添加到場(chǎng)景中顯示。

scene.add( cube );

這樣,一個(gè)三維的長方體就繪制完成了
關(guān)于其他形狀的繪制,張?chǎng)├虻膖hreejs入門指南中介紹的很詳細(xì),在此不多贅述。
這部分的完整代碼如下:




    
    Document
    
    




    


看上去它只是一個(gè)長方形而已,但是它確實(shí)是一個(gè)立體圖形,你可以改變一下camera的位置來觀察一下。

camera.position.set( 5,3,10 );


好了,這樣看起來是一個(gè)立體的長方體了吧。

三、創(chuàng)建3d對(duì)象

大多數(shù)時(shí)候,我們需要講繪制的圖形整合到一起進(jìn)行控制。此時(shí),我們便需要一個(gè)3d對(duì)象。

創(chuàng)建一個(gè)自己的對(duì)象

在上面繪制的那個(gè)長方體上面再放一個(gè)球。

var geometry = new THREE.SphereGeometry( 0.5,100,100 );
var material = new THREE.MeshBasicMaterial( { color: 0xb9c16c } );
var ball = new THREE.Mesh( geometry,material );
ball.position.set( 0,0,1 );
scene.add(ball);

另說一句,默認(rèn)放置mesh的位置是( 0,0,0 ),和改變相機(jī)位置一樣,我們可以用ball.position.set方法來改變圖形或?qū)ο蟮奈恢谩R虼藙?dòng)畫也利用這個(gè)方法來實(shí)現(xiàn)。
然后要把它們整合成一個(gè)對(duì)象。
首先我們創(chuàng)建一個(gè)對(duì)象。

var myobj = new THREE.Object3D();

然后把我們畫的圖形添加到對(duì)象里就ok啦。

myobj.add( cube );
myobj.add( ball );

這時(shí)候我們已經(jīng)有了一個(gè)3d對(duì)象,它包含我們剛剛繪制的長方形和球。于是就沒有必要像原來那樣把圖形一個(gè)一個(gè)地放置到場(chǎng)景里,只需要把剛剛創(chuàng)建的對(duì)象放置到場(chǎng)景里。

scene.add( myobj );

完整代碼如下:




    
    Document
    
    





    
外部導(dǎo)入.obj文件

threejs支持從外部導(dǎo)入.obj文件,聽說這種文件是用3DsMax繪制的,用PS也可以編輯。我們需要引入OBJMTLLoader.js,MTLLoader.js文件;也有一個(gè)OBJLoader.js,但利用這個(gè)庫只能導(dǎo)入模型而不能導(dǎo)入繪制obj時(shí)添加的材質(zhì),個(gè)人感覺不是非常實(shí)用,就不做介紹了。這時(shí)候,我們需要把文件們放到一個(gè)服務(wù)器上,否則會(huì)出現(xiàn)跨域問題。
為了讓圖像更明顯,我們添加一些光線。

scene.add( new THREE.AmbientLight( 0xffffff ) );

這里,我們通過導(dǎo)入圖片來設(shè)置這個(gè)對(duì)象的紋理。

var texture = new THREE.Texture();
var loader = new THREE.ImageLoader( );
loader.load( "tank.jpg", function ( image ) {
    texture.image = image;
    texture.needsUpdate = true;
} );

開始導(dǎo)入我們的3D對(duì)象!

var loader = new THREE.OBJMTLLoader();  
loader.load("tank.obj","tank.mtl",function(object){ 
    tank = object;

    object.traverse(function(child){
        if (child instanceof THREE.Mesh){
        //將貼圖賦于材質(zhì)
            child.material.map = texture;
            child.material.transparent = true;
        }
    });
    object.position.set(0,0,0);
    scene.add( object );  
    camera.lookAt( object.position ); 
    renderer.render( scene,camera );  
});  


模型導(dǎo)入進(jìn)去了,但是看起來還是很奇怪,這就要我們加一些其他光線渲染一下。在這里我們添加平行光線。

var directionalLight = new THREE.DirectionalLight( 0xffffff, 1.5 );
directionalLight.position.set( 1, 1, 1 )
scene.add( directionalLight );


變得光澤多了。
從外部導(dǎo)入obj的完整代碼:




    
    Document
    
    
      
     




    
四、動(dòng)畫

現(xiàn)在我們想辦法讓這些圖形動(dòng)起來。
在threejs中運(yùn)用最多的動(dòng)畫是用requestAnimationFrame()方法。也可以利用傳統(tǒng)的setInterval()做,但用這個(gè)會(huì)掉幀。
這里我們做一個(gè)render函數(shù),來進(jìn)行渲染和動(dòng)畫調(diào)用。這里以前面添加了myobj對(duì)象的代碼為基礎(chǔ)。

基本的動(dòng)畫

現(xiàn)在來不斷地改變對(duì)象的角度方便對(duì)其進(jìn)行觀察。




    
    Document
    
    





    
對(duì)動(dòng)畫進(jìn)行控制

接著讓我們對(duì)動(dòng)畫進(jìn)行控制。
在我實(shí)現(xiàn)的項(xiàng)目中,是通過websocket連接后臺(tái)傳入?yún)?shù)來控制對(duì)象運(yùn)動(dòng)的,這里就介紹一下使用參數(shù)控制吧。
這里有一個(gè)問題,就是requestAnimationFrame回調(diào)的函數(shù)不能帶有參數(shù),否則會(huì)出現(xiàn)奇怪的bug。所以我選擇用一個(gè)全局對(duì)象來進(jìn)行控制。

var control={
    s:0,
    p:0,
    q:0,
    j:0,
}

這里s是運(yùn)動(dòng)的速度,p,q,j分別是myobj將要運(yùn)動(dòng)到的位置的x,y,z坐標(biāo)。我們先寫一個(gè)控制它在x軸上運(yùn)動(dòng)的函數(shù):

var run = function () {
    if ( myobj.position.xcontrol.p ) {
        myobj.position.x -= control.s;
        requestAnimationFrame( run );
        renderer.render( scene,camera )
    };
}

再在render函數(shù)中添加對(duì)run的調(diào)用requestAnimationFrame( run )。這樣就可以在命令行中改變對(duì)象control的值實(shí)現(xiàn)控制myobj的運(yùn)動(dòng)。但是在運(yùn)動(dòng)停止后我的瀏覽器為什么會(huì)變得很卡,而且運(yùn)動(dòng)速度回有變化。我還不知道原因。不知道有沒有朋友和我有同樣的問題。于是我把函數(shù)拆成了兩個(gè),這樣瀏覽器性能好些。

var run = function () {

    if ( myobj.position.xcontrol.p ) {
    myobj.position.x -= control.s;            
        requestAnimationFrame( runx );
    };
        renderer.render( scene,camera )    
}

同樣的,也可以寫出在y,z軸上運(yùn)動(dòng)的函數(shù)。
在x軸上運(yùn)動(dòng)的完整代碼:




    
    Document
    
    





    

這個(gè)入門教程就到這里了,感謝閱讀。

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://m.hztianpu.com/yun/86079.html

相關(guān)文章

  • SegmentFault 技術(shù)周刊 Vol.35 - WebGL:打開網(wǎng)頁看大片

    摘要:在文末,我會(huì)附上一個(gè)可加載的模型方便學(xué)習(xí)中文藝術(shù)字渲染用原生可以很容易地繪制文字,但是原生提供的文字效果美化功能十分有限。 showImg(https://segmentfault.com/img/bVWYnb?w=900&h=385); WebGL 可以說是 HTML5 技術(shù)生態(tài)鏈中最為令人振奮的標(biāo)準(zhǔn)之一,它把 Web 帶入了 3D 的時(shí)代。 初識(shí) WebGL 先通過幾個(gè)使用 Web...

    objc94 評(píng)論0 收藏0
  • 產(chǎn)品三維模型在線預(yù)覽

    摘要:次時(shí)代傳統(tǒng)的方式就是創(chuàng)建次時(shí)代模型,對(duì)應(yīng)中的材質(zhì)是高光網(wǎng)格材質(zhì)對(duì)象,通常貼圖文件包含顏色貼圖法線貼圖和高光貼圖。 產(chǎn)品在線展示案例預(yù)覽 玉鐲在線預(yù)覽:http://www.yanhuangxueyuan.co... 汽車在線預(yù)覽:http://www.yanhuangxueyuan.co... Web3D技術(shù)歷史 可通過插件或WebGL技術(shù)實(shí)現(xiàn)Web3D,在線網(wǎng)頁上預(yù)覽操作三維...

    DirtyMind 評(píng)論0 收藏0
  • vue-threeJS數(shù)據(jù)驅(qū)動(dòng)的三維圖形可視化

    摘要:數(shù)據(jù)驅(qū)動(dòng)的三維圖形可視化在信息暴漲的年間,冷暴力的扁平化確實(shí)有效降低用戶的信息焦慮感,使有限的精力更高效處理過多的信息流。 數(shù)據(jù)驅(qū)動(dòng)的三維圖形可視化 在信息暴漲的2010-2016年間,冷暴力的扁平化確實(shí)有效降低用戶的信息焦慮感,使有限的精力更高效處理過多的信息流。二維平面化扁平化在蘋果等大頭引領(lǐng)下,成為大眾用戶機(jī)器交流默認(rèn)的語言。然后,隨著PC、平板、手機(jī)、智能家居等用戶持有終端的性...

    SegmentFault 評(píng)論0 收藏0
  • 高仿騰訊QQ Xplan(X計(jì)劃)的H5頁面(1):threejs創(chuàng)建地球

    摘要:首先是這個(gè)地球,得看看它是真還是假因?yàn)楹芏嘈Ч悄醚┍虉D做的,比如這里的旋轉(zhuǎn)的飛機(jī),結(jié)果找到了并且在網(wǎng)站文件中搜到了,那就是沒跑了。 上個(gè)月底,在朋友圈看到一個(gè)號(hào)稱這可能是地球上最美的h5的分享,點(diǎn)進(jìn)入后發(fā)現(xiàn)這個(gè)h5還很別致,思考了一會(huì),決定要不高仿一個(gè)? 到今天為止,高仿基本完成, 線上地址 github地址 除了手機(jī)端的media控制沒有去兼容,其他的基本都給仿了。 那為了讓你...

    MartinHan 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

閱讀需要支付1元查看
<