1. 程式人生 > >學習Three.js——材質(Material)

學習Three.js——材質(Material)

材質

材質的種類

MeshBasicMaterial:基礎材質,給幾何體賦予一種簡單的顏色,不受光源的影響

MeshDepthMaterial:深度材質,這種材質根據攝像機到網格的距離給網格上色,常用於得到物體逐漸原理視線消失的效果

MeshNormalMaterial:法向材質,這種材質根據每個面的法向量而附上不同的顏色

MeshFaceMaterial:面材質,可以為幾何體的不同面賦予不同的材質

MeshLambertMaterial:Lambert材質,一種表面粗糙,比較暗淡的材質

MeshPhongMaterial:一種比較光亮的材質

ShaderMaterial

:著色器材質,允許使用自定義的著色器

LineBasicMaterial:直線基礎材質,用於建立著色的直線

LineDashMaterial:和直線基礎材質一樣,不過可以建立一種虛線的效果

材質的共有屬性

id:識別符號,用於識別材質,第一個材質為0,第二個為1,以此類推

name:名稱,也是用於識別材質

opacity:不透明度,1表示不透明,0表示完全透明,和transparent配合使用

transparent:是否使用透明,當設定為true時opacity才有效

visible:是否可見,設定為false則看不見物體

side:用於設定幾何體那一面應用材質,THREE.FrontSide表示外側,THREE.BackSize表示內側,THREE.DoubleSide表示兩側,但是比較耗資源

needsUpdate:是否需要更新,若設定為true,下一次渲染則使用新的材質,並重新設定為false

MeshBasicMaterial

基礎材質的顏色只與初始化定義的顏色有關,不受光照的影響。

基礎材質有自己的特有屬性。

color:顏色

wireframe:是否顯示線框

wireframeLinewidth:線框線的寬度

shading:定義著色的方式,可選的值有

-THREE.SmoothShading:平滑過渡,看不到面和麵之間的連線

-THREE.NoShading:不使用著色

-THREE.FlatShading:

vertexColors

:頂點顏色,可選的值有

-THREE.NoColors:沒有顏色

-THREE.VertexColors:使用geometry幾何體的顏色

fog:是否受全域性霧化的影響
在這裡插入圖片描述

MeshDepthMeterial

這種材質的外觀不受光照的影響,而是由物體到攝像機的距離決定,通過這種材質和其他材質組合,可以創造出逐漸消失的效果。

它只有兩種屬性

wireframe:是否顯示線框

wireframeLineWidth:控制線框的寬度

效果

在這裡插入圖片描述

MeshNormalMaterial

這種材質根據每個面的法向量不同而對該面使用不同的材質

它有三種屬性:

wireframe:是否顯示線框

wireframeLineWidth:控制線框的寬度

shading:選擇不同的著色方式,可以選擇THREE.FlatingShading(平面著色)和THREE.SmoothShading(平滑著色)

THREE.FlatingShading:

在這裡插入圖片描述
THREE.SmoothFlating

在這裡插入圖片描述

THREE.MeshFaceMaterial

這不是一種材質,而是為每個面分配不同的材質

用法

var group = new THREE.Mesh();
        // add all the rubik cube elements
        var mats = [];
        mats.push(new THREE.MeshBasicMaterial({color: 0x009e60}));
        mats.push(new THREE.MeshBasicMaterial({color: 0x009e60}));
        mats.push(new THREE.MeshBasicMaterial({color: 0x0051ba}));
        mats.push(new THREE.MeshBasicMaterial({color: 0x0051ba}));
        mats.push(new THREE.MeshBasicMaterial({color: 0xffd500}));
        mats.push(new THREE.MeshBasicMaterial({color: 0xffd500}));
        mats.push(new THREE.MeshBasicMaterial({color: 0xff5800}));
        mats.push(new THREE.MeshBasicMaterial({color: 0xff5800}));
        mats.push(new THREE.MeshBasicMaterial({color: 0xC41E3A}));
        mats.push(new THREE.MeshBasicMaterial({color: 0xC41E3A}));
        mats.push(new THREE.MeshBasicMaterial({color: 0xffffff}));
        mats.push(new THREE.MeshBasicMaterial({color: 0xffffff}));

        var faceMaterial = new THREE.MeshFaceMaterial(mats);

        for (var x = 0; x < 3; x++) {
            for (var y = 0; y < 3; y++) {
                for (var z = 0; z < 3; z++) {
                    var cubeGeom = new THREE.BoxGeometry(2.9, 2.9, 2.9);
                    var cube = new THREE.Mesh(cubeGeom, faceMaterial);
                    cube.position.set(x * 3 - 3, y * 3, z * 3 - 3);

                    group.add(cube);
                }
            }
        }
        
        scene.add(group);

注意這裡使用了群(group),將小立方體加入群組成一個大立方體。

另外系統會為每個面分配對應的材質(materialIndex),也可以自己手動為每個面定義材質。

效果圖:

在這裡插入圖片描述

MeshLambertMaterial

一種表面比較暗淡的材質

ambient:環境的環境色,好像沒什麼用

emissive:材質發射的顏色,用於創造一種不受光源影響的顏色

wrapAround:此屬效能夠使得陰影變得柔和和分佈均勻

wrapRGB:用於控制光下降的速度

效果:

在這裡插入圖片描述

MeshPhongMaterial

一種比較光亮的材質,屬性有

ambient:環境光,好像沒什麼用

emissive:材質發出來的光,不受外部光照的影響

specular:用於設定材質光亮程度和高光部分的顏色

shininess:設定材質高光部分的亮度

metal:使得物體看起來更像金屬

wrapAroundwrapRGB:和上面的一樣

效果:

在這裡插入圖片描述

MeshShaderMaterial

LineBasicMaterial

用於渲染線段的材質,一些基本屬性:

color:線段的顏色,如果定義了vertexColors,那麼該屬性將被忽略

vertexColor:線段端點的顏色,將其設定為THREE.VertexColors則可以根據colors陣列為每個端點分配顏色,同時決定了線段的顏色

lineWidth:線段的寬度

fog:是否受全域性霧化的影響

用法:

        var points = gosper(4, 60);//得到一條gosper曲線的各個頂點,暫時沒搞懂這個函式
        var lines = new THREE.Geometry();
        var colors = [];
        var i = 0;
        points.forEach(function (e) {
            lines.vertices.push(new THREE.Vector3(e.x, e.z, e.y));
            colors[i] = new THREE.Color(0xffffff);//為每個端點都分配一個顏色,這裡使用HSL色彩空間
            colors[i].setHSL(e.x / 100 + 0.5, (  e.y * 20 ) / 300, 0.8);
            i++;
        });

        lines.colors = colors;
        var material = new THREE.LineBasicMaterial({
            opacity: 1.0,
            linewidth: 1,
            vertexColors: THREE.VertexColors
        });

        var line = new THREE.Line(lines, material);

效果

在這裡插入圖片描述

LineDashMaterial

和前者差不多,但是可以繪製曲線,除了有以上的屬性外,還有

scale:縮放dashSize和gapSize

dashSize:實線部分的長度

gapSize:虛線部分的長度

效果:

在這裡插入圖片描述