使用Three.js的材质
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可通过联合材质创建出新效果。使用方式如下:
...
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);
...
展示效果如下:
这些方块可以从MeshDepthMaterial对象获得渐变效果,从MeshBasicMaterial获取颜色。为了使颜色能够有渐变效果,必须设置MeshBasicMaterial的transparent为true,设置融合blending的方式。在查看最后一行代码,如何不这样设置,在渲染的时候就会出现闪烁。
5.计算法向颜色的MeshNormalMaterial
MeshNormalMaterial会根据每个面的法向量来决定颜色,如果是一个球面,由于每个面的法向量不一样,所有每个面的颜色也不一样。该材质最主要的一个属性是shading,设置着色的方式:THREE.FlatShading表示平面着色、THREE.SmoothShading表示平滑作色。两个着色差别如下图所示:
5.为每个面指定材质的MeshFaceMaterial
通过MeshFaceMaterial可以为几何体的每一个面指定不同的材质。加入你有一个方块,上面有六个面,你可以用这种材质来为每个面指定一个材质。例如:
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);
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代码:
<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>
由于几个几何体有多个面,所有一般都会写多个fragmentShader,每一个面包含对应一个fragmentShader。fragmentShader我们可以从网站(https://www.shadertoy.com)上拷贝各种各样的片元着色器。下面是创建一个ShaderMaterial的例子:
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;
}
我们设置了attributes、uniforms参数。在初始化ShaderMaterial的时候传递进去。最后创建一个几何体。例如:
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);
9.线段几何体材质LineBasicMaterial
LineBasiceMaterial包含的属性如下所示:
color/指定线的颜色。如果指定了vertexColors,这个属性就会被忽略。
linewidth/该属性定义线的宽度
LineCap/该属性定义顶点建的线段端点如何显示。可选值包括butt(平)、round(圆)、square(方),默认值是round。WebGLRenderer不支持该属性。
LineJoin/该属性定义的是线段连接点如何显示。WebGLRenderer不支持该属性
vertexColors/将这个属性设置成THREE.VecterColors值,就可以为每个顶点指定一个颜色
fog/指定当期物体是否受全局雾化效果影响
下面的代码是使用LineBasicMaterial根据Gosper曲线创建的连线显示代码:
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.Geometry实例,为每个坐标创建一个顶点,把它放进该实例的线段属性中。对于每个坐标我们还会计算一个颜色值,用来设置colors属性。
线段还有另外一个LineDashedMaterial材质,和LineBasicMaterial材质功能相似。区别在于显示线段时包含了短划线和空格。包含属性有scale、dashSize(断线长度)、gapSize(间隔长度)。另外还需注意的是必须要调用THREE.Geometry的computeLineDistance()方法,如果不调用,间隔就不会显示出来。
使用Three.js的材质的更多相关文章
- Three.js开发指南---使用three.js的材质(第四章)
材质就像物体的皮肤,决定了几何体的外表,例如是否像草地/金属,是否透明,是否显示线框等 一 材质 THREE.js的材质分为多种,Three.js提供了一个材质基类THREE.Material, 该基 ...
- three.js各种材质的实现源码
three.js常用材质:基本材质.兰伯特材质.冯氏材质.标准材质. 我们可以自己使用着色器实现这些材质,用于批量渲染等用途. 为了简单,假设物体只有一张漫反射贴图,场景中只存在一个环境光和一个平行光 ...
- three.js - 添加材质 灯光 阴影
看下运行效果: 源码解释: <!DOCTYPE html> <html lang="en"> <head> <meta charset=& ...
- 20-THREE.JS 混合材质
<!DOCTYPE html> <html> <head> <title></title> <script src="htt ...
- 23-THREE.JS 光照材质
<!DOCTYPE html> <html> <head> <title></title> <script src="htt ...
- 22-THREE.JS 面材质
<!DOCTYPE html> <html> <head> <title>Example 04.05 - Mesh face material</ ...
- 19-THREE.JS 深度材质
<!DOCTYPE html> <html> <head> <title></title> <script src="htt ...
- 18-THREE.JS 基本材质
<!DOCTYPE html> <html> <head> <title></title> <script src="htt ...
- 深入理解Three.js中线条Line,LinLoop,LineSegments
前言 在可视化开发中,无论是2d(canvas)开发还是3d开发,线条的绘制应用都是比较普遍的.比如绘制城市之间的迁徙图,运行轨迹图等.本文主要讲解的是Three.js中三种线条Line,LineLo ...
随机推荐
- Selenium Web 自动化 - 项目持续集成
Selenium Web 自动化 - 项目持续集成 2017-02-13 目录 1环境准备 1.1 安装git 1.2 安装jenkins 1.3 安装jenkins插件 1.4 jekins ...
- 在Chrome中安装PostMan用来测试SpringBoot程序
1. 首先下载一个PostMan的插件,Postman_v4.1.3.crx 下载下来为这种类型的文件. 2. 在Chrome中输入chrome://extensions/ 这个,打开Chrome的扩 ...
- 阿里云Linux启动tomcat并能外网访问
问题描述: 先描述一下我的心路历程吧,新买了阿里云服务器,由于需求不是很大,只是为了备案,所以买了个最低配的,而且是Windows server2012的.那现在需要做的是在这个乞丐版的server上 ...
- Java基础——深入理解Java中的final关键字(转载)
Java中的final关键字非常重要,它可以应用于类.方法以及变量.这篇文章中我将带你看看什么是final关键字?将变量,方法和类声明为final代表了什么?使用final的好处是什么?最后也有一些使 ...
- 查看某个ip地址接在交换机的哪个接口
show ip interface brief 1.如果交换机上没有做VLAN 可以直接使用:show arp MPG3560#sh arp Protocol Address Age (min) Ha ...
- IOS动态自适应标签实现
先上效果图 设计要求 1.标签的宽度是按内容自适应的 2.一行显示的标签个数是动态的,放得下就放,放不下就换行 3.默认选中第一个 4.至少选中一个标签 实现思路 首先我们从这个效果上来看,这个标签是 ...
- JDBC连接数据以及操作数据
好久没有写博文了,写个简单的东西热热身,分享给大家. jdbc相信大家都不陌生,只要是个搞java的,最初接触j2ee的时候都是要学习这么个东西的,谁叫程序得和数据库打交道呢!而jdbc就是和数据库打 ...
- AutoIt 脚本小试——刷网易云音乐歌单
AutoIt 确实是个很强大的脚本工具. 如果早知道有这个,当初是怎么都不会去学易语言的 (๑•̀ω•́๑) 这是个简单脚本 = ๛ก(ー̀ωー́ก) 用来增加歌单播放次数和个人的听歌量. 原理不过 ...
- 修复关于apache-xampp的问题:Port 443 in use by “vmware-hostd.exe”!
内容提要:复关于apache-xampp的问题:Port 443 in use by “vmware-hostd.exe”!在电脑里装了VMware后,再要装xampp,十有八九就会出现这个问题: 复 ...
- JIRA6.36-7.23数据迁移文档
JIRA6.3.6-JIRA7.2.3数据迁移文档 安装JIRA7.2.3 安装包位于服务器/opt/SOFTWARE_PACKAGE目录下 建立JIRA安装的目录数据目录 cd /opt mkdir ...