ThreeJS学习:材质(一)材质类型

前言

ThreeJS学习:场景、模型、相机、渲染中,我们简单介绍了ThreeJS中的物体包含两个要素,一个是形状,一个是材质,本章节进行材质的学习。

一、材质介绍

什么材质?简单来说,材质是材料与质感的结合体,指物体表面的质地特征,由色彩、纹理、光滑度等可视属性构成。
所以不同的材质,物体表面的展示是效果不同。
比如,地板的种类又很多,不同的材质,地板的展示效果是不同的。
在ThreeJS中,用Material来定义物体的材质。
本章节中,介绍开发中常用的物体材质子类。

一、网络基础材质 MeshBasicMaterial

此种材质是ThreeJS中的一种基础材质,它不受光照的影响,始终以纯色或纹理显示。

不论光照强度和颜色咋样变化,物体表面完全按照材质本身的配置进行显示。

  // 创建几何体,模型的形状
  const geometry = new THREE.BoxGeometry(100, 100, 100);

  // 创建网络基础材质
  const material = new THREE.MeshBasicMaterial({
    color: 0xff_00_00, // 0xff0000设置材质颜色为红色
    transparent: false, // 开启透明
  });

  const mesh = new THREE.Mesh(geometry, material);
  mesh.position.set(0, 0, 0);
效果图

二、网络漫反射材质 MeshLambertMaterial

什么是漫反射?
漫反射是指光线被粗糙表面无规则地向各个方向反射的现象。很多物体,如植物、墙壁、衣服等,其表面粗看起来似乎是平滑,但用放大镜仔细观察,就会看到其表面是凹凸不平的,所以本来是平行的太阳光被这些表面反射后,就弥漫地射向不同方向。

MeshLambertMaterial就是用来表示生活中这些粗糙的物体的材质。其是受光照影响的,光的强度越强,材质表面越亮,反之越暗。

  // 创建几何体,模型的形状
  const geometry = new THREE.BoxGeometry(100, 100, 100);

  // 创建漫反射材质
  const material = new THREE.MeshLambertMaterial({
    color: 0xFF_00_00, // 0xff0000设置材质颜色为红色
    transparent: true, // 开启透明
  });

  const mesh = new THREE.Mesh(geometry, material);
  mesh.position.set(0, 0, 0);

  // 创建灯光
  const pointLight = new THREE.PointLight(0xFF_FF_FF, 100);
  pointLight.position.set(100, 100, 0);
  pointLight.decay = 0.9;
  scene.add(pointLight);
效果图

三、网络高光材质

高光材质,主要是用来模拟表面光泽的材质,例如镜子、玻璃、金属等表面光滑的物体材质。其受光照的影响,光照越强显示越亮。

  // 创建几何体,模型的形状
  const geometry = new THREE.BoxGeometry(100, 100, 100);

  // 创建漫反射材质
  const material = new THREE.MeshPhongMaterial({
    color: 0xff_00_00, // 0xff0000设置材质颜色为红色
    shininess: 30, // 控制高光的集中程度,值越高表面越闪亮
  });

  const mesh = new THREE.Mesh(geometry, material);
  mesh.position.set(0, 0, 0);

四、物理材质 PBR

所谓PBR就是,基于物理的渲染。基于物理的光照模型可以提供更逼真的、更接近生活中的材质效果,当然也会占用更多的电脑硬件资源。
ThreeJS中,提供了MeshStandardMaterialMeshPhysicalMaterial两个api来实现PBR材质。

1、MeshStandardMaterial

  // 创建几何体,模型的形状
  const geometry = new THREE.BoxGeometry(100, 100, 100);

  // 创建物理材质
  const material = new THREE.MeshStandardMaterial({
    metalness: 1, // 金属度属性 表示材质像金属的程度, 非金属材料,如木材或石材,使用0.0,金属使用1.0。
    roughness: 0.5, // 表面粗糙度表示模型表面的光滑或者说粗糙程度,越光滑镜面反射能力越强,越粗糙,表面镜面反射能力越弱,更多地表现为漫反射。
  });

  const mesh = new THREE.Mesh(geometry, material);
  mesh.position.set(0, 0, 0);
效果图

2、MeshPhysicalMaterial

MeshPhysicalMaterialMeshStandardMaterial的子类,在MeshStandardMaterial的基础上清漆、透光率等属性,用来实现更接近物体的材质效果,当然性能要求也越高。

  // 创建几何体,模型的形状
  const geometry = new THREE.BoxGeometry(100, 100, 100);

  // 创建物理材质
  const material = new THREE.MeshPhysicalMaterial({
    metalness: 1,
    roughness: 0.5,
    clearcoat: 1, // 清漆层: 用来模拟物体表面一层透明图层,就好比你在物体表面刷了一层透明清漆,喷了点水
    clearcoatRoughness: 0.1, // 清漆层粗糙度: 表示物体表面清漆层的粗糙程度
  });

  const mesh = new THREE.Mesh(geometry, material);
  mesh.position.set(0, 0, 0);
效果图

五、点材质 PointsMaterial

通常用于设置点对象的时候,才使用的材质。其他属性设置与MeshBasicMaterial基本一致。

// 创建一个空的几何体对象
  const geometry = new THREE.BufferGeometry();

  // 类型化数组创建顶点数据
  const vertices = new Float32Array([
    0,
    0,
    0, // 顶点1坐标
    50,
    0,
    0, // 顶点2坐标
    0,
    50,
    0, // 顶点3坐标
    0,
    0,
    50, // 顶点4坐标
  ]);

  const attribue = new THREE.BufferAttribute(vertices, 3);

  // 设置几何体attributes属性的位置属性
  geometry.attributes.position = attribue;

  // 点材质对象
  const material = new THREE.PointsMaterial({
    color: 0xFF_00_00, // 点颜色
    size: 10, // 点对象像素尺寸
  });
  // 创建点模型对象
  const mesh = new THREE.Points(geometry, material);
  mesh.position.set(0, 0, 0);
效果图

六、线基础材质 LineBasicMaterial

线基础材质通常在绘制线段(直线、曲线等)的时候使用的模型材质,其他用法与MeshBasicMaterial基本一直。

  const startPoint = new THREE.Vector2(0, 0);
  const endPoint = new THREE.Vector2(50, 50);
  /**
   * 创建直线
   * 第一个参数:直线开始坐标
   * 第二个参数:直线结束坐标
   */
  const line = new THREE.LineCurve(startPoint, endPoint);
  const pointArray = line.getPoints(3);

  // 创建一个空的几何体对象
  const geometry = new THREE.BufferGeometry();
  geometry.setFromPoints(pointArray);

  const material = new THREE.LineBasicMaterial({
    color: 0xff_00_ff, // 线条颜色
  });
  // 创建模型对象
  const mesh = new THREE.Line(geometry, material);
  mesh.position.set(0, 0, 0);
效果图

七、精灵材质 SpriteMaterial

精灵材质是在绘制精灵模型的时候才会使用的材质。具体学习可参考精灵模型

八、源代码

demo

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 官网3D Banner效果 three.js+vue实现 最近没什么事,写了一个3D Banner效果,给广大前端...
    郭隆邦技术博客阅读 789评论 0 0
  • 一、前言 材质和纹理有那么一点微妙的关系,纹理决定了物体的表面,而材质则决定了物体的“气质”,比如说,反射度,光滑...
    仰简阅读 1,208评论 0 1
  • 几何体 定义 几何体是物体在三维空间中的形状,它决定了物体的外观和结构。在 Three.js 中,几何体是通过TH...
    伶俜Monster阅读 219评论 0 1
  • 1.几何体 内置几何体three.js的内置几何体大致可分为以下几类: 二维几何体 三维几何体 路径合成几何体 线...
    浮若年华_7a56阅读 1,462评论 0 0
  • 链接:【暮志未晚的博客,包含各种模型】:https://www.wjceo.com/blog/threejs/【中...
    海货阅读 1,049评论 0 0

友情链接更多精彩内容