three.js浅谈@材质

材质种类

上一节介绍了光源,但是表现一个物体的表面仅仅需要光源是不够的,光源与材质进行影响,会表现出不同的表面
材质大致分为以下几种

  1. MeshBasicMaterial
  2. MeshDepthMaterial
  3. MeshLambertMaterial
  4. MeshNormalMaterial
  5. MeshPhongMaterial
  6. MeshStandardMaterial
  7. MeshPhysicalMaterial
  8. MeshToonMaterial

材质总类实在太多了,我们介绍几种常用的来管中窥豹

MeshBasicMaterial

这是一种基础材质,光照在上面处处都会表现出一样的颜色,此种材质是其他几种材质的基础

const mat = new THREE.MeshBasicMaterial({
  ...
});

以下是材质构造函数的部分参数

  • color — 一个十六进制的颜色值。默认为 0xffffff (白色)。
  • map — 设置纹理图。 默认情况下是空的 (null)。
  • aoMap — 设置 AO 贴图。默认情况下为空(null)。
  • aoMapIntensity — 设置AO贴图的强度。 默认情况下为 1.
  • specularMap — 设置镜面贴图。默认情况下为空(null)。
  • alphaMap — 设置 alpha 贴图(alpha 贴图是一种灰度纹理,可以控制表面的不透明性(黑色:完全透明;白色:完全不透明))。默认情况下为空(null)。
  • envMap — 设置环境映射。默认情况下为空(null)。
  • combine — 如何将表面颜色的结果与环境地图相结合。默认情况下使用的是 THREE.MultiplyOperation;而它还有其他两种结合形式:THREE.MixOperation 和 THREE.AddOperation。如果使用混合( mix )的方法进行结合,使用反射率混合两种颜色。
  • reflectivity — 设置反射率。默认为 1.
  • refractionRatio — 环境贴图的折射率默认使用 THREE.CubeRefractionMapping 。默认为 0.98。
  • fog — 确定材料的颜色是否受雾化的影响,这是一个布尔值。默认为 true。值得注意的是它被 *CanvasRender 所忽略,想要这个参数有效需要使用 WebGLRender 。
  • shading — 定义阴影类型。默认为 THREE.SmoothShading.
  • wireframe — 是否将几何体呈现为线框的形式,这是一个布尔值。默认为 false。
  • wireframeLinewidth — 设置的是线条的宽度。默认为 1。不过很遗憾的是,在 Windows 上这个值无论设置多少都只能显示为 1 。
  • wireframeLinecap — 设置的是线条端点的样式。 默认为 round 。这个值只在 CanvasRender 上有效,在 * WebGLRender 上并不会有任何改变。
  • wireframeLinejoin — 设置的是线条交点的样式。 默认为 round。这个值只在 CanvasRender 上有效,在 * WebGLRender 上并不会有任何改变。
  • vertexColors — 定义定点的颜色,其中有三个选项 THREE.NoColors, THREE.FaceColors 和 THREE.VertexColors。默认是 THREE.NoColors。
  • skinning — 确定材料是否使用 skinning,这是一个布尔值。默认为 false。
  • morphTargets — 确定材料是否使用了变形目标。默认为 false。

MeshLambertMaterial

这种材质是一种漫反射材质,表现类型和基础材质基本类似,但是相比基础材质处处的颜色相同,漫反射材质会和光源产生影响,不同光照强度会产生不同的反射强度
并且此种材料多了个重要参数

  • emissive:设置自发光颜色,值得注意的是材质其实并不会发光,而是在反光中会带有这种颜色


    不带自发光

    带红色自发光,强度为0.3

MeshPhongMaterial

这种材料是一种镜面反射的材料可以用于表现金属等具有镜面反射的性质
这种材质在MeshLambertMaterial多了种特有的参数

  • specular 镜面反色光颜色


    image.png

参考代码

const THREE= window.THREE=require('three')
const scene = new THREE.Scene();//创建一个场景
const camera = new THREE.PerspectiveCamera(50, window.innerWidth/window.innerHeight, 0.1, 1000);
camera.position.z=150//因为刚刚创建的对象都会位于原点,我们需要把相机拉远一点
//创建一个渲染器,并设置大小,然后把这个渲染器加入到dom中
const renderer = new THREE.WebGLRenderer();
renderer.setSize(window.innerWidth, window.innerHeight);
document.body.appendChild(renderer.domElement);
const light = new THREE.DirectionalLight('#fff',1)
light.position.set(-100,-69,20)//光方向

const mat = new THREE.MeshPhongMaterial({
    color: new THREE.Color("rgb(220,76,65)"),
    shininess:10,
    specular:new THREE.Color("rgb(220,76,65)"),
    emissive:new THREE.Color("rgb(6,53,53)"),
    shading: THREE.FlatShading 
});
// const mat = new THREE.MeshLambertMaterial({
//     color: new THREE.Color("rgb(106,153,153)"),
//     emissive: new THREE.Color("rgb(220,76,65)"),
//     emissiveIntensity: 0.3
// });
// const mat = new THREE.MeshBasicMaterial({
//     color: new THREE.Color("rgb(106,153,153)"),
// });
//创建一个多面体模型,并将模型和材质结合
const ballGeometry = new THREE.IcosahedronGeometry(50,2);
const ball = new THREE.Mesh( ballGeometry, mat );

scene.add(light)//场景中加入光源
scene.add( camera )//场景中加入相机
scene.add( ball )//场景中加入多面体

renderer.render(scene, camera);

参考

  1. https://hopepdm.github.io/blog/archivers/stuJs14
  2. https://zhuanlan.zhihu.com/p/25939826
  3. http://blog.bbadtimes.com/2017/10/29/401
  4. https://blog.csdn.net/csdn2193714269/article/details/77807798
  5. https://www.cnblogs.com/w-wanglei/p/6736615.html
  6. http://www.yanhuangxueyuan.com/Three.js_course/material.html
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,772评论 6 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,458评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,610评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,640评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,657评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,590评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,962评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,631评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,870评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,611评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,704评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,386评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,969评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,944评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,179评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,742评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,440评论 2 342

推荐阅读更多精彩内容