通俗易懂的THREE.js学习之路[4]

前言

今天我们将学习使用第一章通俗易懂的THREE.js学习之路 - 掘金 (juejin.cn)总结的规律使three.js完成更真实的3d效果。

最终我们将学会怎么样轻松的把下面这座小屋子放到我们的网页中。

介绍

首先我们来看看这个例子(example6^1^)

一一道来

在这个例子中,我们看到了更逼近现实世界的效果,包括阴影,物体。

完成该例子,我们至少需要知道如何放置一个物体,以及设置点光源。

物体
ts 复制代码
    const geometry = new THREE.BoxGeometry(1, 1, 1);
    const material = new THREE.MeshPhongMaterial({ color: 0xffffff, side: THREE.DoubleSide });
    const mesh = new THREE.Mesh(geometry, material);
    mesh.position.set(0, 0, 0)
    mesh.castShadow = true
    scene.add(mesh);

以上代码,我们制作了一个长宽高为1的几何体,材质颜色为白色(如果发现没有效果,注意这里的颜色一定不要和环境光颜色一样)且有两个

面指的是渲染是否会发生在上面,立方体的第二个面在内部,所以理论上只渲染一个面更节省性能。

其中,要注意的是一定要让物体能产生阴影castShadow,否则无论如何都不会有阴影的效果。

ts 复制代码
    const dirLight = new THREE.SpotLight(0xffffff, 1)
    dirLight.position.set(0, 3, 2)
    dirLight.target.position.set(0, 0, 0)
    dirLight.shadow.mapSize.set(1024, 1024)
    dirLight.castShadow = true

以上代码,我们设置了一个点光源,颜色为白色,位置在(0,3,2)照射向(0,0,0),mapSize我们可以直接理解成阴影的层数,数值越高,阴影越清晰,最后也给点光源一个能造成阴影的属性。

在css中写过阴影的同学都知道,必须多写点阴影层数才能更真实

此处我们补充一个简单的光源,环境光。

const ambLight = new THREE.AmbientLight(0x000000, 1)

一行即可完成环境光的设置,这是由于环境光没有什么可以设置的属性,仅是一个从全部方位射来的光。

平面

当完成以上两步骤后我们会发现并没有阴影,这是由于阴影被投射到了无限远的地方,我们需要一个平面承接住阴影。

ts 复制代码
    const planeGeometry = new THREE.PlaneGeometry(200, 200);
    const planeMaterial = new THREE.MeshPhongMaterial({ color: 0xffffff });
    const plane = new THREE.Mesh(planeGeometry, planeMaterial);
    planeGeometry.rotateX(-Math.PI / 2);
    // 使平面就接收物体投掷过来的阴影
    plane.receiveShadow = true;
    plane.position.set(0, -0.6, 0)

这段代码我们设置了一个长宽为200,材质为白色的平面,并沿着x轴旋转90度来水平放置,并使其可以接受阴影,最后设置其位置向下放0.6个单位。

注意到我们没有给它设置双面材质,因此我们会发现从下往上看是看不到任何东西的(无法理解这段描述可以尝试在项目网站试试看)。

不要忘记将他们放入场景哟。

总结

至此我们完成了一个处于黑暗中的小方块。目前为止,我们还缺少了的一些内容有:

  1. 噪声(用于给物体表面有起伏效果)
  2. 大量重复(任何物体都不是简单的形状)

噪声可能会在未来某天补充,由于其用到相当复杂的数学原理,因此,应该是一个独立的单元。

大量重复则直接地表明了是毫无意义的。

解决方案有两个:

scss 复制代码
在官网(或其他模型网站)寻找合适例子
使用3d建模软件自己动手

不管选择哪个,我们都会得到模型文件(格式有obj,mlt,wasm等),加载它们并不难就不展开了。

计划

后面会再把shadertoy使用指南补上,然后就开始新的领域了。

最近鸽了很久,整了一个有意思的东西

Footnotes

  1. 网站来自这里(learn3d-neon.vercel.app)]
相关推荐
Martin -Tang22 分钟前
vite和webpack的区别
前端·webpack·node.js·vite
迷途小码农零零发23 分钟前
解锁微前端的优秀库
前端
王解1 小时前
webpack loader全解析,从入门到精通(10)
前端·webpack·node.js
我不当帕鲁谁当帕鲁1 小时前
arcgis for js实现FeatureLayer图层弹窗展示所有field字段
前端·javascript·arcgis
那一抹阳光多灿烂1 小时前
工程化实战内功修炼测试题
前端·javascript
放逐者-保持本心,方可放逐2 小时前
微信小程序=》基础=》常见问题=》性能总结
前端·微信小程序·小程序·前端框架
毋若成4 小时前
前端三大组件之CSS,三大选择器,游戏网页仿写
前端·css
红中马喽4 小时前
JS学习日记(webAPI—DOM)
开发语言·前端·javascript·笔记·vscode·学习
Black蜡笔小新5 小时前
网页直播/点播播放器EasyPlayer.js播放器OffscreenCanvas这个特性是否需要特殊的环境和硬件支持
前端·javascript·html
秦jh_6 小时前
【Linux】多线程(概念,控制)
linux·运维·前端