最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Three.js學(xué)習(xí)之Lamber材質(zhì)和Phong材質(zhì)

 更新時間:2016年08月04日 16:51:22   投稿:daisy  
本篇將介紹基本材質(zhì)以及兩種基于光照模型的材質(zhì)(Lamber與Phong),有需要的小伙伴們可以參考學(xué)習(xí)。

前言

  材質(zhì)(Material)是獨立于物體頂點信息之外的與渲染效果相關(guān)的屬性。通過設(shè)置材質(zhì)可以改變物體的顏色、紋理貼圖、光照模式等。

  MeshBasicMaterial:對光照無感,給幾何體一種簡單的顏色或顯示線框。

  MeshLambertMaterial:這種材質(zhì)對光照有反應(yīng),用于創(chuàng)建暗淡的不發(fā)光的物體。

  MeshPhongMaterial:這種材質(zhì)對光照也有反應(yīng),用于創(chuàng)建金屬類明亮的物體。

1.基本材質(zhì)

  使用基本材質(zhì)(BasicMaterial)的物體,渲染后物體的顏色始終為該材質(zhì)的顏色,而不會由于光照產(chǎn)生明暗、陰影效果。如果沒有指定材質(zhì)的顏色,則顏色是隨機的。其構(gòu)造函數(shù)是:

THREE.MeshLambertMaterial(opt)

  其中,opt可以缺省,或者為包含各屬性的值。如新建一個不透明度為0.75的黃色材質(zhì):

new THREE.MeshBasicMaterial({

 color: 0xffff00,

 opacity: 0.75

});

  將其應(yīng)用于一個正方體(方法參見《Three.js學(xué)習(xí)之幾何形狀》,效果為:

源碼:

<!DOCTYPE html>
<html>
 <head>
 <meta charset="UTF-8">
 <title>3.js測試7.1</title>
 </head>
 <body onload="init()">
 <canvas id="mainCanvas" width="400px" height="300px" ></canvas>
 </body>
 <script type="text/javascript" src="js/three.min.js"></script>
 <script type="text/javascript">
 function init() {
 var renderer = new THREE.WebGLRenderer({
 canvas: document.getElementById('mainCanvas')
 });
 renderer.setClearColor(0x000000);
 var scene = new THREE.Scene();
 
 // camera
 var camera = new THREE.OrthographicCamera(-5, 5, 3.75, -3.75, 0.1, 100);
 camera.position.set(25, 25, 25);
 camera.lookAt(new THREE.Vector3(0, 0, 0));
 scene.add(camera);
 
 // light
 var light = new THREE.PointLight(0xffffff, 1, 100);
 light.position.set(10, 15, 5);
 scene.add(light);
 
 var material = new THREE.MeshBasicMaterial({
 color: 0xffff00,
 opacity: 0.75
 });
 
 var cube = new THREE.Mesh(new THREE.CubeGeometry(5, 5, 5), material);
 scene.add(cube);
 
 renderer.render(scene, camera);
 }
 </script>
</html>

 BasicMaterial的幾個較為常用的屬性:

  · visible:是否可見,默認為true

  · side:渲染面片正面或是反面,默認為正面THREE.FrontSide,可設(shè)置為反面THREE.BackSide,或雙面THREE.DoubleSide

  · wireframe:是否渲染線而非面,默認為false

  · color:十六進制RGB顏色,如紅色表示為0xff0000

  · map:使用紋理貼圖 

  對于基本材質(zhì),即使改變場景中的光源,使用該材質(zhì)的物體也始終為顏色處處相同的效果。當然,這不是很具有真實感,因此,接下來我們將介紹更為真實的光照模型:Lambert光照模型以及Phong光照模型。 

2.Lamber材質(zhì)與Phong材質(zhì)

  Lambert材質(zhì)(MeshLambertMaterial)是符合Lambert光照模型的材質(zhì)。Lambert光照模型的主要特點是只考慮漫反射而不考慮鏡面反射的效果,因而對于金屬、鏡子等需要鏡面反射效果的物體就不適應(yīng),對于其他大部分物體的漫反射效果都是適用的。

  其光照模型公式為:

Idiffuse = Kd * Id * cos(theta)

  其中,Idiffuse是漫反射光強,Kd是物體表面的漫反射屬性,Id是光強,theta是光的入射角弧度。

  當然,對于使用Three.js的Lambert材質(zhì),不需要了解以上公式就可以直接使用。

創(chuàng)建一個黃色的Lambert材質(zhì)的方法為:

new THREE.MeshLambertMaterial({

 color: 0xffff00

})

  在使用了光照之后,得到這樣的效果:

 

  color是用來表現(xiàn)材質(zhì)對散射光的反射能力,也是最常用來設(shè)置材質(zhì)顏色的屬性。除此之外,還可以用ambient和emissive控制材質(zhì)的顏色。

  ambient表示對環(huán)境光的反射能力,只有當設(shè)置了AmbientLight后,該值才是有效的,材質(zhì)對環(huán)境光的反射能力與環(huán)境光強相乘后得到材質(zhì)實際表現(xiàn)的顏色。

  emissive是材質(zhì)的自發(fā)光顏色,可以用來表現(xiàn)光源的顏色,并不是一種光源,而是一種不受光照影響的顏色。單獨使用紅色的自發(fā)光:

new THREE.MeshLambertMaterial({

 emissive: 0xff0000

})

  效果為:

 

  如果同時使用紅色的自發(fā)光與黃色的散射光:

new THREE.MeshLambertMaterial({

 color: 0xffff00,

 emissive: 0xff0000

})

  效果為:

 

  球體的效果:

 

   總結(jié)Lamber材質(zhì)的特有屬性:

  ambient:設(shè)置材質(zhì)的環(huán)境色,和AmbientLight光源一起使用,這個顏色會與環(huán)境光的顏色相乘。即是對光源作出反應(yīng)。

  emissive:設(shè)置材質(zhì)發(fā)射的顏色,不是一種光源,而是一種不受光照影響的顏色。默認為黑色。 

  源碼: 

<!DOCTYPE html>
<html>
 <head>
 <meta charset="UTF-8">
 <title>3.js測試7.2</title>
 </head>
 <body onload="init()">
 <canvas id="mainCanvas" width="400px" height="300px" ></canvas>
 </body>
 <script type="text/javascript" src="js/three.min.js"></script> 
 <script type="text/javascript">
 function init() {
 var renderer = new THREE.WebGLRenderer({
 canvas: document.getElementById('mainCanvas')
 });
 renderer.setClearColor(0x000000);
 var scene = new THREE.Scene();
 
 // camera
 var camera = new THREE.OrthographicCamera(-5, 5, 3.75, -3.75, 0.1, 100);
 camera.position.set(25, 25, 25);
 camera.lookAt(new THREE.Vector3(0, 0, 0));
 scene.add(camera);
 
 // light
 var light = new THREE.PointLight(0xffffff, 1, 100);
 light.position.set(10, 15, 5);
 scene.add(light);
 
 var material = new THREE.MeshLambertMaterial({
 color: 0xffff00,
 emissive: 0xff0000
 });
 
 var cube = new THREE.Mesh(new THREE.CubeGeometry(5, 5, 5), material);
 scene.add(cube);

// var sphere = new THREE.Mesh(new THREE.SphereGeometry(3, 20, 8), material);
// scene.add(sphere);
 
 renderer.render(scene, camera);
 }
 </script>
</html>

3.phong材質(zhì)

  Phong材質(zhì)(MeshPhongMaterial)是符合Phong光照模型的材質(zhì)。和Lambert不同的是,Phong模型考慮了鏡面反射的效果,因此對于金屬、鏡面的表現(xiàn)尤為適合。

  漫反射部分和Lambert光照模型是相同的,鏡面反射部分的模型為:

        Ispecular = Ks * Is * (cos(alpha)) ^ n

  其中,Ispecular是鏡面反射的光強,Ks是材質(zhì)表面鏡面反射系數(shù),Is是光源強度,alpha是反射光與視線的夾角,n是高光指數(shù),越大則高光光斑越小。

  由于漫反射部分與Lambert模型是一致的,因此,如果不指定鏡面反射系數(shù),而只設(shè)定漫反射,其效果與Lambert是相同的:

new THREE.MeshPhongMaterial({

 color: 0xffff00

});

  同樣地,可以指定emissive和ambient值,這里不再說明。下面就specular值指定鏡面反射系數(shù)作說明。首先,我們只使用鏡面反射,將高光設(shè)為紅色,應(yīng)用于一個球體:

var material = new THREE.MeshPhongMaterial({

 specular: 0xff0000

});

var sphere = new THREE.Mesh(new THREE.SphereGeometry(3, 20, 8), material);

  效果為:

 

  可以通過shininess屬性控制光照模型中的n值,當shininess值越大時,高光的光斑越小,默認值為30。我們將其設(shè)置為1000時:

new THREE.MeshPhongMaterial({

 specular: 0xff0000,

 shininess: 1000

});

  效果為:

 

  使用黃色的鏡面光,紅色的散射光:

material = new THREE.MeshPhongMaterial({

 color: 0xff0000,

 specular: 0xffff00,
 
 shininess: 100

});

  總結(jié)Phong材質(zhì)的特有屬性:

  ambient:設(shè)置材質(zhì)的環(huán)境色,和AmbientLight光源一起使用,這個顏色會與環(huán)境光的顏色相乘。即是對光源作出反應(yīng)。

  emissive:設(shè)置材質(zhì)發(fā)射的顏色,不是一種光源,而是一種不受光照影響的顏色。默認為黑色

  specular:指定該材質(zhì)的光亮程度及其高光部分的顏色,如果設(shè)置成和color屬性相同的顏色,則會得到另一個更加類似金屬的材質(zhì),如果設(shè)置成grey灰色,則看起來像塑料

  shininess:指定高光部分的亮度,默認值為30. 

  源碼: 

<!DOCTYPE html>
<html>
 <head>
 <meta charset="UTF-8">
 <title>3.js測試7.3</title>
 </head>
 <body onload="init()">
 <canvas id="mainCanvas" width="400px" height="300px" ></canvas>
 </body>
 <script type="text/javascript" src="js/three.min.js"></script>
 <script type="text/javascript">
 function init() {
 var renderer = new THREE.WebGLRenderer({
 canvas: document.getElementById('mainCanvas')
 });
 renderer.setClearColor(0x000000);
 var scene = new THREE.Scene();
 
 // camera
 var camera = new THREE.OrthographicCamera(-5, 5, 3.75, -3.75, 0.1, 100);
 camera.position.set(25, 25, 25);
 camera.lookAt(new THREE.Vector3(0, 0, 0));
 scene.add(camera);
 
 // light
 var light = new THREE.PointLight(0xffffff, 1, 200);
 light.position.set(10, 15, 25);
 scene.add(light);
 
 var material = new THREE.MeshPhongMaterial({
// specular: 0xff0000,
 color: 0xff0000,
 specular: 0xffff00,
 shininess: 100
 });
 
// var cube = new THREE.Mesh(new THREE.CubeGeometry(5, 5, 5), material);
// scene.add(cube);
 
 var sphere = new THREE.Mesh(new THREE.SphereGeometry(3, 20, 8), material);
 scene.add(sphere);
 
 renderer.render(scene, camera);
 }
 </script>
</html>

總結(jié)

本文的內(nèi)容到這就結(jié)束了,文章通過詳細實例及圖片介紹了Three.js中的Lamber與Phong,希望對大家的學(xué)習(xí)有所幫助,小編會陸續(xù)整理Three.js的相關(guān)文章,對Three.js感興趣的朋友們請繼續(xù)支持腳本之家。

相關(guān)文章

  • 交互式可視化js庫gojs使用介紹及技巧

    交互式可視化js庫gojs使用介紹及技巧

    這篇文章主要介紹了如何使用可視化庫gojs及使用時的小技巧,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2022-01-01
  • Highcharts入門之簡介

    Highcharts入門之簡介

    Highcharts 是一個用純JavaScript編寫的一個圖表庫, 能夠很簡單便捷的在web網(wǎng)站或是web應(yīng)用程序添加有交互性的圖表,并且免費提供給個人學(xué)習(xí)、個人網(wǎng)站和非商業(yè)用途使用。下面通過本文的介紹及實例一起來學(xué)習(xí)學(xué)習(xí)吧。
    2016-08-08
  • Highcharts學(xué)習(xí)之坐標軸

    Highcharts學(xué)習(xí)之坐標軸

    今天講交互圖表Highcharts的坐標軸,我們將對Highcharts圖表的坐標軸組成、坐標軸類型等進行詳細系統(tǒng)講解。下面一起來看看。
    2016-08-08
  • Three.js學(xué)習(xí)之文字形狀及自定義形狀

    Three.js學(xué)習(xí)之文字形狀及自定義形狀

    今天小編帶大家學(xué)習(xí)的是Three.js的文字形狀與自定義形狀,文章內(nèi)容很詳細,對大家學(xué)習(xí)Three.js或許有幫助,下面一起來看看吧。
    2016-08-08
  • Highcharts學(xué)習(xí)之數(shù)據(jù)列

    Highcharts學(xué)習(xí)之數(shù)據(jù)列

    數(shù)據(jù)列配置是 Highcharts 最復(fù)雜也是最靈活的配置,如果說 Highcharts 是靈活多變,細節(jié)可定制的話,那么數(shù)據(jù)列配置就是這個重要特性的核心。
    2016-08-08
  • Three.js學(xué)習(xí)之正交投影照相機

    Three.js學(xué)習(xí)之正交投影照相機

    本篇主要介紹照相機中的正交投影照相機。學(xué)習(xí)Three.js的小伙伴們可以參考學(xué)習(xí)。
    2016-08-08
  • 基于d3.js實現(xiàn)實時刷新的折線圖

    基于d3.js實現(xiàn)實時刷新的折線圖

    本文用實例演示如何用d3.js實現(xiàn)實時刷新的折線圖,非常具有實用價值,需要的朋友可以參考下。
    2016-08-08
  • 使用RequireJS庫加載JavaScript模塊的實例教程

    使用RequireJS庫加載JavaScript模塊的實例教程

    RequireJS庫的主旨就是一個js文件的模塊加載器,可以獨立于框架來進行使用,這里我們整理了使用RequireJS庫加載JavaScript模塊的實例教程,需要的朋友可以參考下
    2016-06-06
  • Three.js學(xué)習(xí)之網(wǎng)格

    Three.js學(xué)習(xí)之網(wǎng)格

    本篇將先介紹創(chuàng)建較為常用的物體:網(wǎng)格,然后介紹如何修改物體的屬性。下面跟著小編一起來學(xué)習(xí)學(xué)習(xí)。
    2016-08-08
  • JS日程管理插件FullCalendar中文說明文檔

    JS日程管理插件FullCalendar中文說明文檔

    JS日程管理插件FullCalendar提供了豐富的屬性設(shè)置和方法調(diào)用,開發(fā)者可以根據(jù)FullCalendar提供的API快速完成一個日歷日程的開發(fā),本文將FullCalendar的常用屬性和方法、回調(diào)函數(shù)等整理成中文文檔,以供參閱。
    2017-02-02

最新評論

昌乐县| 嘉兴市| 潮安县| 修武县| 荆州市| 马尔康县| 泽州县| 成安县| 吴川市| 西平县| 高碑店市| 静安区| 井研县| 读书| 民权县| 屯门区| 扬中市| 沈丘县| 茂名市| 苗栗市| 乌拉特前旗| 黄浦区| 乐清市| 沙洋县| 宝鸡市| 九寨沟县| 罗平县| 丰都县| 正宁县| 周口市| 文昌市| 桐庐县| 新绛县| 长白| 桐梓县| 长沙县| 社会| 织金县| 微山县| 黄骅市| 哈巴河县|