用three.js在網(wǎng)頁實現(xiàn)3D模型的展示

最近在做一個在網(wǎng)頁端展示3D模型的項目童本,現(xiàn)在簡單介紹一下怎么實現(xiàn)功能摄职。首先,下載three.js文件笼踩,在threejs官網(wǎng)能下逗爹,這里附上地址鏈接一條https://threejs.org/然后,下載解壓嚎于,會得到three.js-master文件掘而,在build目錄找到three.js,這個是three.js的核心功能庫于购。在example/js/loaders目錄袍睡,你會看到各種模型格式加載的js文件。

作者:林智超__

鏈接:http://www.reibang.com/p/0798a76121af

來源:簡書

簡書著作權(quán)歸作者所有肋僧,任何形式的轉(zhuǎn)載都請聯(lián)系作者獲得授權(quán)并注明出處斑胜。

本次以加載obj模型為例,準(zhǔn)備好obj和mtl文件的模型素材嫌吠。創(chuàng)建場景的js文件用到基本的three.js伪窖,加載模型的js文件用到DDSLoader.js,MTLLoader.js居兆,OBJLoader.js覆山,鏡頭的轉(zhuǎn)動用OrbitControls.js文件。當(dāng)然也有其他功能實現(xiàn)替代的js文件泥栖,用到的js文件不唯一簇宽,文件路徑自行設(shè)置。本次實例導(dǎo)入如圖js文件

實現(xiàn)的Javascript代碼如下吧享,注釋會解釋各塊代碼是干嘛用? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?

var camera, controls, scene, renderer;

init();

animate();

// 加載進(jìn)度

var onProgress = function(xhr) {

? ? ? ? if (xhr.lengthComputable) {

? ? ? ? ? ? var percentComplete = xhr.loaded / xhr.total * 100;

? ? ? ? ? ? var percent = document.getElementById("info");

? ? ? ? ? ? percent.innerText = Math.round(percentComplete, 2) + '% 已經(jīng)加載';

? ? ? ? }

? ? };

? ? var onError = function(xhr) {};

//當(dāng)mtl中引用了dds類型的圖片時魏割,還需導(dǎo)入DDSLoader文件

THREE.Loader.Handlers.add( /\.dds$/i, new THREE.DDSLoader() );

//mtl文件加載器

var mtlLoader = new THREE.MTLLoader();

//你的模型材質(zhì)文件的目錄地方路徑

? ? mtlLoader.setPath('model/yjq/');

//導(dǎo)入材質(zhì)文件

? ? mtlLoader.load('yjq.mtl', function(materials) {

? ? ? ? materials.preload();

? ? ? ? //ob文件加載器

? ? ? ? var objLoader = new THREE.OBJLoader();

? ? ? ? objLoader.setMaterials(materials);

//你的模型文件的目錄地方路徑

? ? ? ? objLoader.setPath('model/yjq');

? ? ? ? objLoader.load('yjq.obj', function(object) {

//這里的object參數(shù)就是模型加載方法的回調(diào)函數(shù),object就是你的模型钢颂,下面的屬性自行設(shè)置

? ? ? ? ? ? // object.position.y = 0;

? ? ? ? ? ? // object.rotation.x = -90;

? ? ? ? ? ? // object.rotation.y = 90;

? ? ? ? ? ? // object.rotation.z = 90;

? ? ? ? ? ? //自行調(diào)整模型比例

? ? ? ? ? ? object.scale.set(10, 10, 10);

? ? ? ? ? ? //加入到場景中

? ? ? ? ? ? scene.add(object);

? ? ? ? }, onProgress, onError);

? ? });

function init() {

? ? //創(chuàng)建一個透視相機(jī)钞它,設(shè)置相機(jī)視角60度,最遠(yuǎn)能看1000,最近能看1

? ? camera = new THREE.PerspectiveCamera( 60, window.innerWidth / window.innerHeight, 1, 1000 );

? ? camera.position.set( 0, 200, 400 );? ? //設(shè)置相機(jī)位置

? ? //控制相機(jī)

? ? controls = new THREE.OrbitControls( camera );

//設(shè)置相機(jī)移動距離

? ? controls.minDistance = 100;

? ? controls.maxDistance = 900;

? ? //創(chuàng)建場景

? ? scene = new THREE.Scene();

? ? //設(shè)置場景背景色遭垛,灰色

? ? scene.background = new THREE.Color( 0xeeeeee );

? ? //場景中添加網(wǎng)格輔助

? ? scene.add( new THREE.GridHelper( 400, 10 ) );

// 燈光

// 給場景添加一個環(huán)境光

? ? var ambientLight = new THREE.AmbientLight( 0xfff );

? ? scene.add( ambientLight );

// 給場景添加一個半球光出來

? ? hemiLight = new THREE.HemisphereLight( 0xffffff, 0xffffff, 0.8 );

? ? hemiLight.color.setHSL( 0.6, 1, 0.6 );

? ? hemiLight.groundColor.setHSL( 0.095, 1, 0.75 );

? ? hemiLight.position.set( 0, 50, 0 );

? ? scene.add( hemiLight );

// 給場景添加一個平行光出來

? ? dirLight = new THREE.DirectionalLight( 0xffffff, 0.8 );

? ? dirLight.color.setHSL( 0.1, 1, 0.95 );

? ? dirLight.position.set( -1, 1.75, 1 );

? ? dirLight.position.multiplyScalar( 30 );

? ? scene.add( dirLight );

? ? dirLight.castShadow = true;

? ? //實例化一個渲染器s

? ? renderer = new THREE.WebGLRenderer( { antialias: true } );

? ? renderer.setPixelRatio( window.devicePixelRatio );

? ? renderer.setSize( window.innerWidth, window.innerHeight );

? ? document.body.appendChild( renderer.domElement );

? ? window.addEventListener( 'resize', onWindowResize, false );

}

function onWindowResize() {

? ? camera.aspect = window.innerWidth / window.innerHeight;

? ? camera.updateProjectionMatrix();

? ? renderer.setSize( window.innerWidth, window.innerHeight );

}

function animate() {

? ? //每一幀渲染一次畫面,不然畫面是靜止的

? ? requestAnimationFrame( animate );

? ? renderer.render( scene, camera );

}

代碼直接粘貼復(fù)制就能用尼桶,但原理和細(xì)節(jié)這里的篇幅解釋不了的那么多谷歌瀏覽器展示效果如下,720度旋轉(zhuǎn)和放大縮小都可以锯仪。最后泵督,如果想繼續(xù)了解更多的功能,可以參考threejs官方的案例

作者:林智超__

鏈接:http://www.reibang.com/p/0798a76121af

來源:簡書

簡書著作權(quán)歸作者所有庶喜,任何形式的轉(zhuǎn)載都請聯(lián)系作者獲得授權(quán)并注明出處小腊。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市久窟,隨后出現(xiàn)的幾起案子秩冈,更是在濱河造成了極大的恐慌,老刑警劉巖斥扛,帶你破解...
    沈念sama閱讀 223,207評論 6 521
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件漩仙,死亡現(xiàn)場離奇詭異,居然都是意外死亡犹赖,警方通過查閱死者的電腦和手機(jī)队他,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,455評論 3 400
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來峻村,“玉大人麸折,你說我怎么就攤上這事≌匙颍” “怎么了垢啼?”我有些...
    開封第一講書人閱讀 170,031評論 0 366
  • 文/不壞的土叔 我叫張陵,是天一觀的道長张肾。 經(jīng)常有香客問我芭析,道長,這世上最難降的妖魔是什么吞瞪? 我笑而不...
    開封第一講書人閱讀 60,334評論 1 300
  • 正文 為了忘掉前任馁启,我火速辦了婚禮,結(jié)果婚禮上芍秆,老公的妹妹穿的比我還像新娘惯疙。我一直安慰自己,他們只是感情好妖啥,可當(dāng)我...
    茶點故事閱讀 69,322評論 6 398
  • 文/花漫 我一把揭開白布霉颠。 她就那樣靜靜地躺著,像睡著了一般荆虱。 火紅的嫁衣襯著肌膚如雪蒿偎。 梳的紋絲不亂的頭發(fā)上朽们,一...
    開封第一講書人閱讀 52,895評論 1 314
  • 那天,我揣著相機(jī)與錄音诉位,去河邊找鬼骑脱。 笑死,一個胖子當(dāng)著我的面吹牛不从,可吹牛的內(nèi)容都是我干的惜姐。 我是一名探鬼主播犁跪,決...
    沈念sama閱讀 41,300評論 3 424
  • 文/蒼蘭香墨 我猛地睜開眼椿息,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了坷衍?” 一聲冷哼從身側(cè)響起寝优,我...
    開封第一講書人閱讀 40,264評論 0 277
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎枫耳,沒想到半個月后乏矾,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,784評論 1 321
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡迁杨,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,870評論 3 343
  • 正文 我和宋清朗相戀三年钻心,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片铅协。...
    茶點故事閱讀 40,989評論 1 354
  • 序言:一個原本活蹦亂跳的男人離奇死亡捷沸,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出狐史,到底是詐尸還是另有隱情痒给,我是刑警寧澤,帶...
    沈念sama閱讀 36,649評論 5 351
  • 正文 年R本政府宣布骏全,位于F島的核電站苍柏,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏姜贡。R本人自食惡果不足惜试吁,卻給世界環(huán)境...
    茶點故事閱讀 42,331評論 3 336
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望楼咳。 院中可真熱鬧潘悼,春花似錦、人聲如沸爬橡。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,814評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽糙申。三九已至宾添,卻和暖如春船惨,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背缕陕。 一陣腳步聲響...
    開封第一講書人閱讀 33,940評論 1 275
  • 我被黑心中介騙來泰國打工粱锐, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人扛邑。 一個月前我還...
    沈念sama閱讀 49,452評論 3 379
  • 正文 我出身青樓怜浅,卻偏偏與公主長得像,于是被迫代替她去往敵國和親蔬崩。 傳聞我的和親對象是個殘疾皇子恶座,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,995評論 2 361

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