中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

使用Three.js的材質

發布時間:2020-07-06 11:26:42 來源:網絡 閱讀:564 作者:張立達 欄目:網絡安全

1.three.js提供哪些材質?

    MeshBasicMaterial(網格基礎材質)/基礎材質,,可以用它富裕幾何體一種簡單的亞瑟,或者顯示幾何體的線框

    MeshDepthMaterial(網格深度材質)/根據網格到相機的舉例,這種材質決定如何給網格染色

    MeshNormalMaterial(網格法向材質)/這是一種簡單的材質,根據物體表面的方向向量計算顏色

    MeshFaceMaterial(網格面材質)/這是一個容器,可以在這個容器里為物體的各個表面指定不同的顏色

    MeshLambertMaterial(網格朗伯材質)/這種材質會考慮光照的影響,可以用來創建顏色暗淡的、不光亮的物體

    MeshPhongMaterial(網格Phong式材質)/這種材質會考慮光照的影響,而且可以用來創建光亮的物體

    ShaderMaterial(著色器材質)/這種材質允許使用自定義的著色器程序,直接控制頂點的仿制方式,以及像素的著色方式

    LineBasicMaterial(直線基礎材質)/這種材質可以用于THREE.Line幾何體,從而創建著色的直線

    LineDashedMaterial(虛線材質)/這種材質跟直線基礎材質一樣,不過可以用來創建出一種虛線效果

2.MeshBasicMaterial常用屬性

    color/設置材質的顏色

    wireframe/設置這個屬性可以將材質渲染成線框。對調試非常有利

    wireframeLinewidth/如果已經打開了wireframe,這個屬性可以定義線框中線的寬度

    wireframeLinecap(線框線端點)/這個屬性定義線框模式下頂點間線段的端點如何顯示。可包括butt(平)、round(圓)、squre(方)。默認值是round。WebGlRenderer不支持該屬性

    shading(著色)/該屬性定義如何著色。可選的值是THREE.SmoothShading和THREE.FlatShading。

    vertexColors(頂點顏色)/可以通過這個屬性為每個頂點定義不同的顏色。該屬性在使用CanvasRenderer時不起作用,但可以在使用WebGLRenderer時起作用。

    fog(霧化)/該屬性指定當前材質是否會受到全局霧化效果設置的影響。

    初始化方式:

var meshMaterial = new THREE.MeshBasicMaterial({color: 0x7777ff});
mashMaterial.visible = false;

3.基于深度著色的MeshDepthMaterial

   使用這種材質的物體,其外觀不是有光照或某個材質屬性決定的;而是由物體到相機的距離決定的。可以將這種材質與其他材質想結合,從而很容易地創建出逐漸消失的效果。   

4.融合材質

    我們知道MeshDepthMaterial不能設置顏色,一切都是有材質的默認屬性決定的。但是,three.js可通過聯合材質創建出新效果。使用方式如下:

使用Three.js的材質

... var cubeGeometry = new THREE.BoxGeometry(cubeSize, cubeSize, cubeSize);                var cubeMaterial = new THREE.MeshDepthMaterial();                var colorMaterial = new THREE.MeshBasicMaterial({color: 0x00ff00, transparent: true, blending: THREE.MultiplyBlending});                var cube = new THREE.SceneUtils.createMultiMaterialObject(cubeGeometry, [colorMaterial, cubeMaterial]);
                cube.children[1].scale.set(0.99, 0.99, 0.99);
...

使用Three.js的材質

   展示效果如下:

使用Three.js的材質

    這些方塊可以從MeshDepthMaterial對象獲得漸變效果,從MeshBasicMaterial獲取顏色。為了使顏色能夠有漸變效果,必須設置MeshBasicMaterial的transparent為true,設置融合blending的方式。在查看最后一行代碼,如何不這樣設置,在渲染的時候就會出現閃爍。

5.計算法向顏色的MeshNormalMaterial

    MeshNormalMaterial會根據每個面的法向量來決定顏色,如果是一個球面,由于每個面的法向量不一樣,所有每個面的顏色也不一樣。該材質最主要的一個屬性是shading,設置著色的方式:THREE.FlatShading表示平面著色、THREE.SmoothShading表示平滑作色。兩個著色差別如下圖所示:

使用Three.js的材質

5.為每個面指定材質的MeshFaceMaterial

    通過MeshFaceMaterial可以為幾何體的每一個面指定不同的材質。加入你有一個方塊,上面有六個面,你可以用這種材質來為每個面指定一個材質。例如:

使用Three.js的材質

var group = new THREE.Mesh();        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 faceMeterial = new THREE.MeshFaceMaterial(mats);        var cubeGeom = new THREE.CubeGeometry(3, 3, 3);        var cube = new THREE.Mesh(cubeGeom, faceMeterial);
        scene.add(cube);

使用Three.js的材質

6.暗淡、不光亮表面材質MeshLambertMaterial

    兩個比較重要的屬性ambient和emissive。ambient(環境色)跟AmbientLight光源一起使用。這個顏色會與AmbientLight光源的顏色相乘。默認值為白色;emissvie(發射的)是該材質發射的顏色。它其實并不像一個光源,只是一種純粹的、不收其他光照影響的顏色。默認值為黑色。實例化方式:

var meshMateial = new THREE.MeshLambertMaterial({color: 0x7777ff});

7.用于光亮表面的MeshPhongMaterial

   除了基礎屬性以及和MeshLambertMaterial一樣的ambient和emissive屬性。還包括:
specular(鏡面的)/該屬性指定該材質的光亮程度及其高亮部分的顏色。如果設置成和color一樣的顏色,將會得到一種更加類似金屬的材質。如果設置為grey,材質變的更加塑料。
   shininess/指定高亮部分的亮度,默認為30

8.使用ShaderMaterial創建自己的著色器

    ShaderMaterial是Three.js庫中功能最豐富、最復雜的一種材質。通過它,可以使用自己定制的著色器,直接在WebGL環境中運行。ShaderMaterial包含的幾個常用屬性wireframe、wireframeLinewidth、shading、vertexColors、fog其他材質已經介紹過。ShaderMaterial還包含幾個特別屬性:
    fragementShader(片元著色器)/這個著色器定義的是每個傳入的像素顏色
    vertexShader(頂點著色器)/這個著色器允許你修改每一個傳入的頂點的位置
    uniforms/通過這個屬性可以向你的著色器發信息。同樣的信息會發送到每一個頂點和片元
    defines/這個屬性可以轉換為vertexShader和fragmentShader里的#define代碼。該屬性可以用來設置著色器程序里的一些全局變量
    attributes/改屬性可以修改每個頂點和片元。通常用來傳遞位置數據和法向量相關的數據。如果要用這個屬性,anemia你要為幾何體中的所有頂點提供信息
    lights/定義光照數據是否傳遞給著色器。默認為false

    在創建ShaderMaterial,必須要傳遞兩個重要的屬性vertexShader和fragmentShader。兩個都是對應的一段WebGL頂點和片元著色器源碼字符串。例如我們在js中先定義一段vertexShader代碼:

使用Three.js的材質

<script id="vertex-shader" type="x-shader/x-vertex">
    uniform float time;
    varying vec2 vUv;    void main()
    {
    vec3 posChanged = position;
    posChanged.x = posChanged.x*(abs(sin(time*1.0)));
    posChanged.y = posChanged.y*(abs(cos(time*1.0)));
    posChanged.z = posChanged.z*(abs(sin(time*1.0)));    //gl_Position = projectionMatrix * modelViewMatrix * vec4(position*(abs(sin(time)/2.0)+0.5),1.0);
    gl_Position = projectionMatrix * modelViewMatrix * vec4(posChanged,1.0);
    }</script>

使用Three.js的材質

    由于幾個幾何體有多個面,所有一般都會寫多個fragmentShader,每一個面包含對應一個fragmentShader。fragmentShader我們可以從網站(https://www.shadertoy.com)上拷貝各種各樣的片元著色器。下面是創建一個ShaderMaterial的例子:

使用Three.js的材質

function createMaterial(vertexShader, fragmentShader){            var verShader = document.getElementById(vertexShader).innerHTML;            var fragShader = document.getElementById(fragmentShader).innerHTML;            var attributes = {};            var uniforms = {
                time: {type: 'f', value: 0.2},
                scale: {type: 'f', value: 0.2},
                alpha: {type: 'f', value: 0.6},
                resolution: {type: 'v2', value: new THREE.Vector2()}
            }

            uniforms.resolution.value.x = window.innerWidth;
            uniforms.resolution.value.y = window.innerHeight;            var meshMaterial = new THREE.ShaderMaterial({
                uniforms: uniforms,
                attributes: attributes,
                vertexShader: verShader,
                fragmentShader: fragShader,
                transparent: true
            });            return meshMaterial;
        }

使用Three.js的材質

    我們設置了attributes、uniforms參數。在初始化ShaderMaterial的時候傳遞進去。最后創建一個幾何體。例如:

使用Three.js的材質

var cubeGeometry = new THREE.BoxGeometry(20, 20, 20);        var meshMaterial1 = createMaterial("vertex-shader", "fragment-shader-1");        var meshMaterial2 = createMaterial("vertex-shader", "fragment-shader-2");
        ...        var material = new THREE.MeshFaceMaterial([meshMaterial1, meshMaterial2, meshMaterial3, meshMaterial4, meshMaterial5, meshMaterial6]);        var cube = new THREE.Mesh(cubeGeometry, material);

        scene.add(cube);

使用Three.js的材質

9.線段幾何體材質LineBasicMaterial

    LineBasiceMaterial包含的屬性如下所示:

    color/指定線的顏色。如果指定了vertexColors,這個屬性就會被忽略。

    linewidth/該屬性定義線的寬度

    LineCap/該屬性定義頂點建的線段端點如何顯示。可選值包括butt(平)、round(圓)、square(方),默認值是round。WebGLRenderer不支持該屬性。

    LineJoin/該屬性定義的是線段連接點如何顯示。WebGLRenderer不支持該屬性

    vertexColors/將這個屬性設置成THREE.VecterColors值,就可以為每個頂點指定一個顏色

    fog/指定當期物體是否受全局霧化效果影響

    下面的代碼是使用LineBasicMaterial根據Gosper曲線創建的連線顯示代碼:

使用Three.js的材質

var points = gosper(4, 60);            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);
                colors[i].setHSL(e.x/100 + 0.5, (e.y * 20)/300, 0.8); // 設置HSL顏色,提供色調(hue)、飽和度(saturation)、亮度(lightness)
                i++;
            });
            lines.colors = colors;            var material = new THREE.LineBasicMaterial({
                opacity: 1.0,
                linewidth: 1,
                vertexColors: THREE.VertexColors
            });            var line = new THREE.Line(lines, material);
            line.position.set(25, -30, -60);

使用Three.js的材質

    代碼創建一個THREE.Geometry實例,為每個坐標創建一個頂點,把它放進該實例的線段屬性中。對于每個坐標我們還會計算一個顏色值,用來設置colors屬性。

    線段還有另外一個LineDashedMaterial材質,和LineBasicMaterial材質功能相似。區別在于顯示線段時包含了短劃線和空格。包含屬性有scale、dashSize(斷線長度)、gapSize(間隔長度)。另外還需注意的是必須要調用THREE.Geometry的computeLineDistance()方法,如果不調用,間隔就不會顯示出來。


向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

晋中市| 平度市| 土默特左旗| 梅河口市| 公安县| 龙井市| 松溪县| 双辽市| 屏山县| 鄂伦春自治旗| 府谷县| 临漳县| 巴南区| 巨鹿县| 休宁县| 内乡县| 澄江县| 民勤县| 清涧县| 澄城县| 航空| 安吉县| 隆回县| 安徽省| 漳州市| 顺义区| 合阳县| 禹城市| 金湖县| 财经| 华宁县| 思南县| 襄汾县| 柯坪县| 汨罗市| 抚远县| 陕西省| 固始县| 谢通门县| 乳山市| 临夏县|