国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

前端前沿web 3d可視化技術(shù) ThreeJS學(xué)習(xí)全記錄

這篇具有很好參考價(jià)值的文章主要介紹了前端前沿web 3d可視化技術(shù) ThreeJS學(xué)習(xí)全記錄。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。

前端前沿web 3d可視化技術(shù)

完整案例與項(xiàng)目代碼:gitee開(kāi)源項(xiàng)目地址 https://gitee.com/jumping-world-line/01_threeJS_basic

隨著瀏覽器性能和網(wǎng)絡(luò)帶寬的提升 使得3D技術(shù)不再是桌面的專(zhuān)利 打破傳統(tǒng)平面展示模式

前端方向主要流向的3D圖形庫(kù)包括Three.js和WebGL

  • WebGL靈活高性能,但代碼量大,難度大,需要掌握很多底層知識(shí)和數(shù)學(xué)知識(shí)
  • Threejs封裝了WebGL的底層細(xì)節(jié),可拓展性強(qiáng),有很多開(kāi)源的插件和工具,更易上手

就像2G時(shí)代文字信息是主要傳輸媒介 3G時(shí)代的圖片 4G時(shí)代的視頻
隨著硬件性能與技術(shù)的提升,未來(lái)的前端也一定是3D的

開(kāi)始學(xué)習(xí)

threejs官方項(xiàng)目

首先要有一定的前端開(kāi)發(fā)基礎(chǔ)以及開(kāi)發(fā)環(huán)境 不多贅述

訪問(wèn)https://threejs.org/ 點(diǎn)擊github
前端3d可視化,往細(xì)分領(lǐng)域卷 ThreeJS,前端,3d,學(xué)習(xí),ThreeJS,WebGL
前端3d可視化,往細(xì)分領(lǐng)域卷 ThreeJS,前端,3d,學(xué)習(xí),ThreeJS,WebGL

拷貝項(xiàng)目到本地即可查看文檔 案例文件 使用編輯器等
前端3d可視化,往細(xì)分領(lǐng)域卷 ThreeJS,前端,3d,學(xué)習(xí),ThreeJS,WebGL
前端3d可視化,往細(xì)分領(lǐng)域卷 ThreeJS,前端,3d,學(xué)習(xí),ThreeJS,WebGL

前端3d可視化,往細(xì)分領(lǐng)域卷 ThreeJS,前端,3d,學(xué)習(xí),ThreeJS,WebGL

parcel打包工具

就像前端需要webpack來(lái)進(jìn)行模塊化開(kāi)發(fā) three JS也需要一個(gè)對(duì)應(yīng)的工具,他就是PARCEL https://www.parceljs.cn/
當(dāng)然,也可以使用前端常用的webpack vite等 各有優(yōu)劣
parcel的優(yōu)勢(shì)在于上手速度快 0配置
前端3d可視化,往細(xì)分領(lǐng)域卷 ThreeJS,前端,3d,學(xué)習(xí),ThreeJS,WebGL
本地新建空文件夾 使用npm init 命令創(chuàng)建新的NPM包
npm install -g parcel-bundler 安裝parcel
手動(dòng)建立如圖的目錄結(jié)構(gòu)與基礎(chǔ)文件 參考
前端3d可視化,往細(xì)分領(lǐng)域卷 ThreeJS,前端,3d,學(xué)習(xí),ThreeJS,WebGL
前端3d可視化,往細(xì)分領(lǐng)域卷 ThreeJS,前端,3d,學(xué)習(xí),ThreeJS,WebGL

到此 使用parcel搭建的最基礎(chǔ)的threeJS開(kāi)發(fā)環(huán)境就完成了

可以拿到ThreeJS的各種接口 方法 常量等

前端3d可視化,往細(xì)分領(lǐng)域卷 ThreeJS,前端,3d,學(xué)習(xí),ThreeJS,WebGL

搭建第一個(gè)場(chǎng)景和物體

打開(kāi)上文提到的本地編輯器
。。。感覺(jué)和當(dāng)年在學(xué)校學(xué)的unity很像,如果有過(guò)類(lèi)似經(jīng)驗(yàn),理解上手會(huì)很快

相機(jī),即使觀察視角
場(chǎng)景,即被觀察的物體
前端3d可視化,往細(xì)分領(lǐng)域卷 ThreeJS,前端,3d,學(xué)習(xí),ThreeJS,WebGL

  • 理解相機(jī)的視錐體概念,官方案例
    const camera = new THREE.PerspectiveCamera( fov : Number, aspect : Number, near : Number, far : Number )
    fov — 攝像機(jī)視錐體垂直視野角度
    aspect — 攝像機(jī)視錐體長(zhǎng)寬比
    near — 攝像機(jī)視錐體近端面
    far — 攝像機(jī)視錐體遠(yuǎn)端面

這些參數(shù)一起定義了攝像機(jī)的viewing frustum(視錐體)。
前端3d可視化,往細(xì)分領(lǐng)域卷 ThreeJS,前端,3d,學(xué)習(xí),ThreeJS,WebGL
main.js案例代碼

//  1.創(chuàng)建場(chǎng)景
const scene = new THREE.Scene()  

//  2.創(chuàng)建并添加相機(jī)
const camera = new THREE.PerspectiveCamera(75,window.innerWidth/window.innerHeight,0.1,1000)  
camera.position.set(0,0,10) //設(shè)置相機(jī)位置
scene.add(camera)


//  3. 在場(chǎng)景中創(chuàng)建并添加物體
const cubGeometry = new THREE.BoxGeometry( 1, 1, 1 );// 創(chuàng)建幾何立方體
const cubMaterial = new THREE.MeshBasicMaterial({color: 0x00ff00} );// 添加材質(zhì)
const cube = new THREE.Mesh( cubGeometry, cubMaterial );// 將幾何體和材質(zhì)組合為物體
scene.add( cube );

//  4.設(shè)置渲染器并渲染場(chǎng)景
const renderer = new THREE.WebGL1Renderer() //初始化渲染器
renderer.setSize(window.innerWidth,window.innerHeight)  //設(shè)置渲染的尺寸大小
document.body.appendChild(renderer.domElement);// 將webgl渲染的內(nèi)容添加到body
renderer.render(scene,camera) // 使用渲染器,通過(guò)相機(jī)將場(chǎng)景渲染進(jìn)來(lái)

案例成功
在瀏覽器中會(huì)渲染出一個(gè)固定視角下觀察到的,黑色場(chǎng)景內(nèi)的綠色綠色正方體的一面。
前端3d可視化,往細(xì)分領(lǐng)域卷 ThreeJS,前端,3d,學(xué)習(xí),ThreeJS,WebGL

軌道控制器查看物體

// 引入軌道控制器
import { OrbitControls } from 'three/examples/jsm/controls/OrbitControls';
// 5.添加控制器-軌道控制器 可以使得相機(jī)圍繞目標(biāo)進(jìn)行軌道運(yùn)動(dòng)  通過(guò)不斷地重新渲染來(lái)實(shí)現(xiàn)移動(dòng)視角的效果
const controls = new OrbitControls(camera,renderer.domElement);

function render(){//遞歸實(shí)現(xiàn)每一幀的重新渲染
    renderer.render(scene,camera)
    requestAnimationFrame(render);
}
render();

前端3d可視化,往細(xì)分領(lǐng)域卷 ThreeJS,前端,3d,學(xué)習(xí),ThreeJS,WebGL

添加坐標(biāo)軸輔助器

const axesHelper = new THREE.AxesHelper( 5 );
scene.add( axesHelper );

前端3d可視化,往細(xì)分領(lǐng)域卷 ThreeJS,前端,3d,學(xué)習(xí),ThreeJS,WebGL

設(shè)置物體移動(dòng)

function render(){//遞歸實(shí)現(xiàn)每一幀的重新渲染
    //  7.通過(guò)循環(huán) 不斷修改物體的位置
    cube.position.x += 0.1;
    if(cube.position.x > 5){
        cube.position.x = 0;
    }
    renderer.render(scene,camera)
    requestAnimationFrame(render);
}

前端3d可視化,往細(xì)分領(lǐng)域卷 ThreeJS,前端,3d,學(xué)習(xí),ThreeJS,WebGL

設(shè)置物體縮放和旋轉(zhuǎn)

//  物體的縮放
cube.scale.set(3,2,1);//指物體在X,Y,Z軸上的縮放倍數(shù)
//  物體的旋轉(zhuǎn) ———— 歐拉角描述一個(gè)旋轉(zhuǎn)變換,通過(guò)指定軸順序和其各個(gè)軸向上的指定旋轉(zhuǎn)角度來(lái)旋轉(zhuǎn)一個(gè)物體。
cube.rotation.set(Math.PI/4,0,0,'XYZ')//物體沿X軸旋轉(zhuǎn)90度

前端3d可視化,往細(xì)分領(lǐng)域卷 ThreeJS,前端,3d,學(xué)習(xí),ThreeJS,WebGL

動(dòng)畫(huà)

gsap 補(bǔ)間動(dòng)畫(huà): https://www.npmjs.com/package/gsap
文檔:https://greensock.com/ 動(dòng)畫(huà)速度調(diào)整

//  9.gsap 補(bǔ)間動(dòng)畫(huà)  ——  無(wú)需再手動(dòng)計(jì)算時(shí)間做動(dòng)畫(huà)了  內(nèi)置API自動(dòng)生成  并能通過(guò)豐富的參數(shù)和回調(diào)進(jìn)行控制
let animate_line = gsap.to(cube.position,{ 
    x: 5 ,                  //軸對(duì)象與動(dòng)畫(huà)值
    duration: 5 ,           //持續(xù)時(shí)間
    ease: "power1.inOut" ,  //速度
    repeat:-1 ,             //重復(fù)次數(shù)
    yoyo:true ,             //往返運(yùn)動(dòng)
    delay:2 ,               //延遲動(dòng)畫(huà)開(kāi)始時(shí)間 
    onComplete:()=>{        //動(dòng)畫(huà)完成的回調(diào)函數(shù)

    },
    onStart:()=>{        //動(dòng)畫(huà)開(kāi)始的回調(diào)函數(shù)

    }
});
let animate_rotat = gsap.to(cube.rotation,{ x: Math.PI*2 , duration: 5 , repeat:-1 , ease: "power1.inOut"});

window.addEventListener("click",()=>{//單擊屏幕暫停
    animate_line.isActive()?animate_line.pause():animate_line.resume()
    animate_rotat.isActive()?animate_rotat.pause():animate_rotat.resume()
})
window.addEventListener("dbclick",()=>{//雙擊屏幕全屏/取消全屏
    document.fullscreenElement?document.exitFullscreen():renderer.domElement.requestFullscreen()
})

function render(){//遞歸實(shí)現(xiàn)每一幀的重新渲染
    //  8.制作動(dòng)畫(huà)  ——  時(shí)間動(dòng)畫(huà)原理(通過(guò)每一幀的生成時(shí)間為基準(zhǔn)來(lái)渲染動(dòng)畫(huà)  clock函數(shù)或render自帶時(shí)間參數(shù))  較簡(jiǎn)單 略...  
    renderer.render(scene,camera)
    requestAnimationFrame(render);
}
render();

前端3d可視化,往細(xì)分領(lǐng)域卷 ThreeJS,前端,3d,學(xué)習(xí),ThreeJS,WebGL

設(shè)置阻尼與監(jiān)聽(tīng)畫(huà)面變化渲染畫(huà)面

// 10.設(shè)置控制器阻尼 更真實(shí)  需要在每一幀重新生成時(shí)調(diào)用controls.update();
controls.enableDamping = true;
// 11.監(jiān)聽(tīng)畫(huà)面變化渲染畫(huà)面  
window.addEventListener('resize',()=>{
    camera.aspect = window.innerWidth/window.innerHeight//更新相機(jī)
    camera.updateProjectionMatrix();//更新相機(jī)投影矩陣
    renderer.setSize(window.innerWidth,window.innerHeight)//更新渲染器尺寸大小
    renderer.setPixelRatio(window.devicePixelRatio)//設(shè)置渲染器像素比————就是縮放比
})

前端3d可視化,往細(xì)分領(lǐng)域卷 ThreeJS,前端,3d,學(xué)習(xí),ThreeJS,WebGL

基本案例完成
總結(jié)主要步驟:

  • 創(chuàng)建場(chǎng)景
  • 創(chuàng)建并添加相機(jī)
  • 在場(chǎng)景中創(chuàng)建并添加物體(幾何體+材質(zhì))
  • 添加軌道控制器與阻尼、 補(bǔ)間動(dòng)畫(huà)(移動(dòng) 縮放 旋轉(zhuǎn)等)、監(jiān)聽(tīng)畫(huà)面變化重新渲染、輔助坐標(biāo)軸等
  • 設(shè)置渲染器并渲染場(chǎng)景

入門(mén)部分的進(jìn)階內(nèi)容

GUI庫(kù) —輕量級(jí)UI界面控制庫(kù)

安裝npm install dat.gui,
很方便的工具 感覺(jué)也可以用在echarts上

import  * as dat from 'dat.gui';



// 12. GUI  實(shí)現(xiàn)開(kāi)發(fā)中快速調(diào)試物體的效果
const gui = new dat.GUI();
// 折疊目錄  設(shè)置文件夾
let folder = gui.addFolder('設(shè)置立方體')
//材質(zhì)工具欄
folder.add(cube.material,'wireframe').name('材質(zhì)');
//坐標(biāo)軸工具欄
folder.add(cube.position,'x').min(0).max(5).step(0.001).name('移動(dòng)X軸坐標(biāo)').onChange((val)=>{
    // 回調(diào)函數(shù) val是修改后的值
}).onFinishChange((val)=>{
    // 回調(diào)函數(shù) val是修改后的值
});
//展示工具欄
folder.add(cube,'visible').name('是否展示')
const params = {
    color:'#ffff00',
    fn:()=>{//動(dòng)畫(huà)
        gsap.to(cube.position,{ 
            x: 5 ,                  //軸對(duì)象與動(dòng)畫(huà)值
            duration: 3 ,           //持續(xù)時(shí)間
            ease: "power1.inOut" ,  //速度
            repeat:-1 ,             //重復(fù)次數(shù)
            yoyo:true ,             //往返運(yùn)動(dòng)
            delay:2 ,               //延遲動(dòng)畫(huà)開(kāi)始時(shí)間 
            onComplete:()=>{        //動(dòng)畫(huà)完成的回調(diào)函數(shù)
        
            },
            onStart:()=>{        //動(dòng)畫(huà)開(kāi)始的回調(diào)函數(shù)
        
            }
        });
    }
};
//顏色工具欄
folder.addColor(params,'color').onChange((val)=>{
    // 回調(diào)函數(shù) val是修改后的值
    cube.material.color.set(val);
})
//動(dòng)畫(huà)工具欄  點(diǎn)擊觸發(fā)特定效果
folder.add(params,'fn').name('移動(dòng)動(dòng)畫(huà)')

前端3d可視化,往細(xì)分領(lǐng)域卷 ThreeJS,前端,3d,學(xué)習(xí),ThreeJS,WebGL

幾何體

基礎(chǔ)概念:

正方體坐標(biāo):最基礎(chǔ)的正方體擁有六個(gè)面,每個(gè)面4個(gè)點(diǎn),共24個(gè)點(diǎn)。每個(gè)點(diǎn)都需要xyz三軸的坐標(biāo),即72個(gè)坐標(biāo)數(shù)據(jù)。
法相量:面的朝向角度
前端3d可視化,往細(xì)分領(lǐng)域卷 ThreeJS,前端,3d,學(xué)習(xí),ThreeJS,WebGL



// 13. 通過(guò)頂點(diǎn)設(shè)置創(chuàng)建幾何體矩形
const geometry = new THREE.BufferGeometry();
const vertices = new Float32Array([
    -1.0,-1.0,1.0,
    1.0,-1.0,1.0,
    1.0,1.0,1.0,
    1.0,1.0,1.0,
    -1.0,1.0,1.0,
    -1.0,-1.0,1.0
]);
geometry.setAttribute('position',new THREE.BufferAttribute(vertices,3));

const Material = new THREE.MeshBasicMaterial({color: 0x00ff00} );// 添加材質(zhì)
const cube = new THREE.Mesh( geometry, Material );// 將幾何體和材質(zhì)組合為物體

前端3d可視化,往細(xì)分領(lǐng)域卷 ThreeJS,前端,3d,學(xué)習(xí),ThreeJS,WebGL

常用網(wǎng)格幾何體:

立方緩沖幾何體、圓形緩沖幾何體、圓錐緩沖幾何體、圓柱緩沖幾何體、八面緩沖幾何體、十二面緩沖幾何體、二十面緩沖幾何體、邊緣緩沖幾何體、擠壓緩沖幾何體、車(chē)削緩沖幾何體、參數(shù)化緩沖幾何體、平面緩沖幾何體、多面緩沖幾何體、圓環(huán)緩沖幾何體、形狀緩沖幾何體、球緩沖幾何體、圓環(huán)緩沖扭結(jié)幾何體、管道緩沖幾何體、網(wǎng)格幾何體

紋理與材質(zhì)

物體=幾何體+紋理與材質(zhì)
相同的形狀,加上不同的紋理即可表示不同的物體。例如長(zhǎng)方體,可能是板磚,可能是煙盒,也可能是手機(jī)等

紋理

// 14 紋理與材質(zhì)
// 導(dǎo)入紋理 通過(guò)圖片加載
const textureLoader = new THREE.TextureLoader();
const wenliColorTexture = textureLoader.load('./textures/123.png')
// const wenliColorTexture = textureLoader.load(require('../assets/imgs/textures/123.pn'))
// 添加物體
const cubeGeometry = new THREE.BoxBufferGeometry(1,1,1)
//材質(zhì)
const BasicMaterial = new THREE.MeshBasicMaterial({
    color:'#ffff00',
    map:wenliColorTexture,
})
const cube = new THREE.Mesh( cubeGeometry, BasicMaterial );// 將幾何體和材質(zhì)組合為物體
scene.add( cube );//在場(chǎng)景中添加物體

前端3d可視化,往細(xì)分領(lǐng)域卷 ThreeJS,前端,3d,學(xué)習(xí),ThreeJS,WebGL

紋理偏移 旋轉(zhuǎn) 重復(fù)等常用屬性
// 14 紋理與材質(zhì)
// 導(dǎo)入紋理 通過(guò)圖片加載
const textureLoader = new THREE.TextureLoader();
const wenliColorTexture = textureLoader.load(require('../assets/imgs/textures/123.png'));//紋理加載器
// 紋理常用屬性
wenliColorTexture.offset.set(0.5,0.5);//偏移
wenliColorTexture.rotation = Math.PI/4;///旋轉(zhuǎn)45°
wenliColorTexture.center.set(0.5,0.5);///旋轉(zhuǎn)原點(diǎn) 默認(rèn)(0,0)
wenliColorTexture.repeat.set(2,3);///重復(fù)次數(shù)
wenliColorTexture.wrapS = THREE.MirroredRepeatWrapping;///重復(fù)模式  水平方向  鏡像重復(fù)
wenliColorTexture.wrapT = THREE.RepeatWrapping;///重復(fù)模式  垂直方向  無(wú)限重復(fù)

前端3d可視化,往細(xì)分領(lǐng)域卷 ThreeJS,前端,3d,學(xué)習(xí),ThreeJS,WebGL

紋理顯示算法與mipmap
// 紋理的顯示算法
// wenliColorTexture.minFilter = THREE.NearestFilter;//一紋素小于一像素時(shí),貼圖如何采樣
// wenliColorTexture.magFilter = THREE.NearestFilter;//一紋素大于一像素時(shí),貼圖如何采樣
wenliColorTexture.minFilter = THREE.LinearFilter;//默認(rèn)值
wenliColorTexture.magFilter = THREE.LinearFilter;//默認(rèn)值

前端3d可視化,往細(xì)分領(lǐng)域卷 ThreeJS,前端,3d,學(xué)習(xí),ThreeJS,WebGL
前端3d可視化,往細(xì)分領(lǐng)域卷 ThreeJS,前端,3d,學(xué)習(xí),ThreeJS,WebGL

透明材質(zhì)與透明紋理

類(lèi)似鐵柵欄場(chǎng)景 需要部分透明 遵循黑遮白顯的原則

// 紋理的透明
const wenliAplhaTexture = textureLoader.load(require('../assets/imgs/alphaMap/alphaMap.png'));//紋理加載器加載不透明度灰階圖片

// 添加物體
const cubeGeometry = new THREE.BoxBufferGeometry(1,1,1)
//材質(zhì)
const BasicMaterial = new THREE.MeshBasicMaterial({
    color:'#ffff00',
    map:wenliColorTexture,
    alphaMap:wenliAplhaTexture,//控制表面透明度(黑色完全透明 白色完全不透明  灰階代表不透明度)
    transparent:true,//允許透明
})
const cube = new THREE.Mesh( cubeGeometry, BasicMaterial );// 將幾何體和材質(zhì)組合為物體
scene.add( cube );//在場(chǎng)景中添加物體

紋理圖片
前端3d可視化,往細(xì)分領(lǐng)域卷 ThreeJS,前端,3d,學(xué)習(xí),ThreeJS,WebGL

設(shè)置透明紋理圖片
前端3d可視化,往細(xì)分領(lǐng)域卷 ThreeJS,前端,3d,學(xué)習(xí),ThreeJS,WebGL
(用PS調(diào)整了半天 一開(kāi)始圖片沒(méi)選好效果不盡如人意了23333)
前端3d可視化,往細(xì)分領(lǐng)域卷 ThreeJS,前端,3d,學(xué)習(xí),ThreeJS,WebGL

PBR——材質(zhì)

基于物理渲染,通過(guò)計(jì)算環(huán)境光線使物體更真實(shí)

  • 燈光屬性(Light Properties):
    • 直接照明:直接從光源發(fā)射的光至物體表面,造成直接漫反射(整體亮)或高光(局部亮)
    • 間接照明: 環(huán)境光直接光等二次反射至物體表面,造成間接漫反射或高光
    • 直接高光
    • 間接高光
    • 陰影
    • 環(huán)境光閉塞
  • 表面屬性(Surface Properties)
    • 基礎(chǔ)色
    • 法線:使得表面顯得凹凸不平,用于添加表面細(xì)節(jié),是一種三維向量(Vector3)數(shù)據(jù)
    • 高光:定義物體表面不同區(qū)域上不同的反射率來(lái)區(qū)分不同的物體材質(zhì)
    • 粗糙度
    • 金屬度
標(biāo)準(zhǔn)網(wǎng)格材質(zhì)與光照效果

漫反射環(huán)境光

// 添加物體
const cubeGeometry = new THREE.BoxBufferGeometry(1,1,1)
// 14 紋理與材質(zhì)   紋理常用屬性 顯示算法 紋理材質(zhì)的透明
// 導(dǎo)入紋理 通過(guò)圖片加載
const textureLoader = new THREE.TextureLoader();
const wenliColorTexture = textureLoader.load(require('../assets/imgs/textures/123.png'));//紋理加載器
// const BasicMaterial = new THREE.MeshBasicMaterial({//基礎(chǔ)材質(zhì) MeshBasicMaterial
// 15. 標(biāo)準(zhǔn)物理網(wǎng)格材質(zhì) MeshStandardMaterial ??需要燈光和表面屬性
const material = new THREE.MeshStandardMaterial({
    map:wenliColorTexture,
    color:'#62b5eb',
})
const cube = new THREE.Mesh( cubeGeometry, material );// 將幾何體和材質(zhì)組合為物體
scene.add( cube );//在場(chǎng)景中添加物體

// 16. 設(shè)置燈光
// 環(huán)境光(顏色 強(qiáng)度)
const light = new THREE.AmbientLight(0XFFFFFF,0.8);
// 直線平行光(顏色 強(qiáng)度 位置)
const directionLight = new THREE.DirectionalLight(0XFFFFFF,0.8);
directionLight.position.set(10,10,10)
scene.add( light );

前端3d可視化,往細(xì)分領(lǐng)域卷 ThreeJS,前端,3d,學(xué)習(xí),ThreeJS,WebGL

漫反射平行光

// 16. 設(shè)置燈光
// 環(huán)境光(顏色 強(qiáng)度)
const light = new THREE.AmbientLight(0XFFFFFF,0.8);
// 直線平行光(顏色 強(qiáng)度 位置)
const directionLight = new THREE.DirectionalLight(0XFFFFFF,0.8);
directionLight.position.set(10,10,10)
scene.add( directionLight);

前端3d可視化,往細(xì)分領(lǐng)域卷 ThreeJS,前端,3d,學(xué)習(xí),ThreeJS,WebGL

粗糙度與粗糙貼圖,金屬度與金屬貼圖,法線貼圖

粗糙度

const material = new THREE.MeshStandardMaterial({
    map:wenliColorTexture,
    color:'#62b5eb',
    roughness:0,//15.2 粗糙度  0-1 數(shù)值越小越光滑
    // roughnessMap:0,//粗糙度貼圖  暫無(wú)資源
})

前端3d可視化,往細(xì)分領(lǐng)域卷 ThreeJS,前端,3d,學(xué)習(xí),ThreeJS,WebGL

金屬度

const material = new THREE.MeshStandardMaterial({
    map:wenliColorTexture,
    color:'#62b5eb',
    roughness:0,//15.2 粗糙度  0-1 數(shù)值越小越光滑
    // roughnessMap:0,//粗糙度貼圖  暫無(wú)資源
    metalness:1,//15.3 金屬度  0-1 數(shù)值越小越不像金屬
    // metalnessMap:0,//金屬度貼圖  暫無(wú)資源
})

前端3d可視化,往細(xì)分領(lǐng)域卷 ThreeJS,前端,3d,學(xué)習(xí),ThreeJS,WebGL
法線:使得表面顯得凹凸不平,用于添加表面細(xì)節(jié),通過(guò)設(shè)置對(duì)應(yīng)貼圖后效果是不同區(qū)域內(nèi)面對(duì)光的反射效果不同,使物體看起來(lái)更真實(shí)。無(wú)圖片資源,下面僅作門(mén)的案例展示
設(shè)置法線貼圖前
前端3d可視化,往細(xì)分領(lǐng)域卷 ThreeJS,前端,3d,學(xué)習(xí),ThreeJS,WebGL

法線貼圖
前端3d可視化,往細(xì)分領(lǐng)域卷 ThreeJS,前端,3d,學(xué)習(xí),ThreeJS,WebGL

設(shè)置法線貼圖后
前端3d可視化,往細(xì)分領(lǐng)域卷 ThreeJS,前端,3d,學(xué)習(xí),ThreeJS,WebGL

紋理材質(zhì)資源網(wǎng)站

到這里已經(jīng)不難發(fā)現(xiàn),再ThreeJS開(kāi)發(fā)中,各種圖片資源對(duì)于最終的效果呈現(xiàn)有著相當(dāng)重要的作用。
這里有推介的資源網(wǎng)站:

  • https://www.poliigon.com/texture ,部分收費(fèi)前端3d可視化,往細(xì)分領(lǐng)域卷 ThreeJS,前端,3d,學(xué)習(xí),ThreeJS,WebGL

  • https://3dtextures.me/

  • http://arroway-textures.ch/textures/,注冊(cè)EPIC 虛幻引擎賬號(hào)可以免費(fèi)試用資源

紋理加載進(jìn)度-設(shè)置加載管理器 LoadingManager

LoadingManager 跟蹤已加載和待加載的數(shù)據(jù)

// 16 設(shè)置加載管理器LoadingManager   跟蹤已加載和待加載的數(shù)據(jù)
let event = {}
event.onLoad = function(){
    console.log('所有資源圖片加載完成')
}
event.onProgress = function(url,num,total){
    console.log(url+'加載完成')
    console.log('加載進(jìn)度:'+num)
    console.log('資源總數(shù):'+total)
    console.log('加載進(jìn)度百分比:'+(num/total*100).toFixed(2)+'%')
}
event.onError = function(e){
    console.log(e)
    console.log('圖片加載錯(cuò)誤')
}
const loadingManager = new THREE.LoadingManager(
    event.onLoad,event.onProgress,event.onError
);

// 14 紋理與材質(zhì)   紋理常用屬性 顯示算法 紋理材質(zhì)的透明
// 導(dǎo)入紋理 通過(guò)圖片加載
const textureLoader = new THREE.TextureLoader(loadingManager);

前端3d可視化,往細(xì)分領(lǐng)域卷 ThreeJS,前端,3d,學(xué)習(xí),ThreeJS,WebGL

環(huán)境紋理貼圖 物體環(huán)境貼圖與場(chǎng)景環(huán)境貼圖

像鏡子一樣 將周?chē)鷪?chǎng)景的圖像映射在物體上
需要設(shè)置三個(gè)軸兩個(gè)方向上的圖片屬性,共六張圖片。

// 17. 環(huán)境貼圖
const cubeTextureLoader = new THREE.CubeTextureLoader();
const envMapTetxture =  cubeTextureLoader.load([
    require('../assets/imgs/textures/envMapTetxture/px.jpg'),
    require('../assets/imgs/textures/envMapTetxture/nx.jpg'),
    require('../assets/imgs/textures/envMapTetxture/py.jpg'),
    require('../assets/imgs/textures/envMapTetxture/ny.jpg'),
    require('../assets/imgs/textures/envMapTetxture/pz.jpg'),
    require('../assets/imgs/textures/envMapTetxture/nz.jpg'),
])

const spherGeometry = new THREE.SphereBufferGeometry(1,20,20);
const material = new THREE.MeshStandardMaterial({
    metalness:0.7,//15.3 金屬度  0-1 數(shù)值越小越不像金屬
    roughness:0.1,//15.2 粗糙度  0-1 數(shù)值越小越光滑
    envMap:envMapTetxture,//17.1  物體環(huán)境貼圖
});

//17.2  場(chǎng)景環(huán)境貼圖  缺少資源  待續(xù)。。。

const sphere = new THREE.Mesh( spherGeometry, material );// 將幾何體和材質(zhì)組合為物體
scene.add( sphere );//在場(chǎng)景中添加物體

前端3d可視化,往細(xì)分領(lǐng)域卷 ThreeJS,前端,3d,學(xué)習(xí),ThreeJS,WebGL

環(huán)境紋理貼圖 物體環(huán)境貼圖與場(chǎng)景環(huán)境貼圖
//17.2   給場(chǎng)景添加背景
scene.background = envMapTetxture;
//17.3   給場(chǎng)景所有物體添加默認(rèn)的環(huán)境貼圖
scene.environment = envMapTetxture;

前端3d可視化,往細(xì)分領(lǐng)域卷 ThreeJS,前端,3d,學(xué)習(xí),ThreeJS,WebGL

燈光屬性

待續(xù)。。。

紋理材質(zhì)初步學(xué)習(xí)完成
總結(jié):文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-790852.html

  • 創(chuàng)建場(chǎng)景
  • 創(chuàng)建并添加相機(jī) 、可設(shè)置軌道控制器與阻尼
  • 在場(chǎng)景中創(chuàng)建并添加物體、可設(shè)置動(dòng)畫(huà)效果(移動(dòng) 縮放 旋轉(zhuǎn)等)
    • 幾何體 多個(gè)三維坐標(biāo)點(diǎn)組成一個(gè)面或二維圖形,多個(gè)面組成一個(gè)幾何體。
      手動(dòng)標(biāo)記點(diǎn)和面生成或利用已有API生成。
    • 紋理:通過(guò)紋理API設(shè)置紋理的顏色、各種效果貼圖、偏移、旋轉(zhuǎn)、重復(fù)、透明貼圖、環(huán)境遮擋等。并設(shè)置紋理顯示算法
    • 材質(zhì) :通過(guò)物理渲染使物體更真實(shí)。設(shè)置燈光屬性的照明與反射效果,陰影等;設(shè)置物體表面的基礎(chǔ)色、法線貼圖、高光、粗糙度及粗糙度貼圖、金屬度及金屬度貼圖等。
  • 設(shè)置渲染器并渲染場(chǎng)景、監(jiān)聽(tīng)畫(huà)面變化重新渲染、輔助坐標(biāo)軸等
  • GUI輕量級(jí)UI界面控制庫(kù)

到了這里,關(guān)于前端前沿web 3d可視化技術(shù) ThreeJS學(xué)習(xí)全記錄的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來(lái)自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

覺(jué)得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包