继续学习three.js基础部分,three.js学习之基础网格材质MeshBasicMaterial中学习了基础网格材质,今天学习另外一种网格材质Lambert网格材质。Lambert网格材质可以用来模仿生活中大部分的非镜面材质,有点类似于生生活中未加工的原材料。它对光照有反应,但是又不会很强烈。按照文档的说法,MeshLambertMaterial材质只在顶点计算光照。我们还是通过实际例子,去了解MeshLambertMaterial材质的一些特征。
还是和以前一样,首先复制three.js学习之基础网格材质MeshBasicMaterial中的代码,然后新建一个learnThree10.html
的文件,将代码全部复制进去,但是这次我们不删除代码,因为three.js中MeshBasicMaterial
中用到的参数,在MeshLambertMaterial
中都能用到。
在
MeshLambertMaterial
构建时传入一个空对象示例MeshBasicMaterial
中,我们在构建扭结圆环材质时传入了一个空的对象,扭结圆环呈现了白色形态,那么我们将MeshLambertMaterial
进行同样的处理,结果会怎么样呢?
首先,修改代码:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24{
// 圆环扭结集合体
const radius = 2;
const tube = 0.3;
const radialSegments = getSearchObj('radialSegments') || 10;
const tubularSegments = getSearchObj('tubularSegments') || 100
const p = getSearchObj('p') || 5
const q = getSearchObj('q') || 4
const torusKnotGeometry = new THREE.TorusKnotGeometry(radius, tube, tubularSegments, radialSegments, p, q)
// const material = new THREE.MeshBasicMaterial({}) 删除这段代买
const material = new THREE.MeshLambertMaterial({}) // 新增这段代码
const torusKnot = new THREE.Mesh(torusKnotGeometry, material)
torusKnot.position.y = 3
const torusKnotLineGeometry = new THREE.WireframeGeometry(torusKnotGeometry)
const torusKnotLine = new THREE.Line(torusKnotLineGeometry, lineMaterial)
torusKnot.position.x = -2
torusKnotLine.position.x = 2
torusKnotLine.position.y = 3
if (search.includes('torusKnot')) {
group.add(tirusKnot)
}
}和在
MeshBasicMaterial
基础材质中的代码对比,我们只是将const material = new THREE.MeshBasicMaterial({})
改成了const material = new THREE.MeshLambertMaterial({})
,最终结果如下
MeshBasicMaterial
MeshLambertMaterial
可以看到,使用
MeshBasicMaterial
基础材质构建的扭结圆环通体都是白色的,而使用MeshLambertMaterial
材质构建的扭结圆环通则有明显的明暗变化,当圆环被光照射的时候,会更将明亮一点,而照不到光的地方,则显的比较暗。在接下来的部分,可以将three.js学习之基础网格材质MeshBasicMaterial中用到的所有demo案例重写一下(其实也就是将MeshBasicMaterial替换成MeshLambertMaterial而已)。我这里把最终结果全部放出来,代码和过程就不重复写了。
用color来决定立体图形用什么颜色
修改地址https://www.91yqz.com/learnThree/learnThree11.html?show=[torusKnot1]&color=7FFFD4e用布尔值
wireframe
来决定是否用线条显示立体图形
修改地址https://www.91yqz.com/learnThree/learnThree11.html?show=[torusKnot1]&color=7FFFD4&wireframe=truetransparent
和opacity
来控制图元(3d形状)的透明性修改地址https://www.91yqz.com/learnThree/learnThree11.html?show=[box]&transparent=true&opacity=0.5
three.js通过修改参数
side
来控制图元(3D形状)的显示方式
THREE.DoubleSideTHREE.BackSIdeTHREE.FrontSide通过参数
needsUpdate
和material.setValues
和来实时修改图元(3D形状)材料的属性
到这里,我们一起了解了一些MeshBasicMaterial
和MeshLambertMaterial
的共有属性,接下来再学习一个MeshLambertMaterial
有而MeshBasicMaterial
没有的属性。
通过设置emissive
和emissiveIntensity
来控制材质的反光属性
- emissive用来设置lambert材质发出的光颜色,这个颜色是不受光照影响的,实质上我们之前不传颜色进去时,默认反射出来的是光的颜色。它默认值为黑色,也就是材质自身不发光。我们可以根据需要,来设置发出的光来。比如把它设置成红色,绿色等。
- emissiveIntensity用来控制材质发出光照的强弱,默认为1,范围是0到1。0表示不发光,1发出的光照最强。
当emissive
的值等于color
的值,且emissiveIntensity
的值为1时,MeshBasicMaterial
就等于MeshLambertMaterial
材质。
将代码中材质的部分做如下的修改:1
2
3
4
5
6
7const material = new THREE.MeshLambertMaterial({
color: '#' + getSearchObj('color'),
wireframe: getSearchObj('wireframe') === 'true' ? true : false,
needsUpdate: true,
emissive: '#' + getSearchObj('emissive'),
emissiveIntensity: getSearchObj('emissiveIntensity')
})
修改地址https://www.91yqz.com/learnThree/learnThree11.html??show=[torusKnot1]&color=00F5FF&emissive=00F5FF&emissiveIntensity=1
color色值等于emissive色值且emissiveIntensity等于1
color色值等于
00F5FF
emissive等于b1d85c
色值且emissiveIntensity等于1color色值等于
00F5FF
emissive等于b1d85c
色值且emissiveIntensity等于0.5
关于three.js学习之Lambert网格材质MeshLambertMaterial基础就学习到这里,下面是源码本文用到的demo源码:
1 | <script> |