Topics

曾经挑战憧憬的3D表现(WebGL)的那些日子 ― 用Three.js和Blender尝试制作

  • column

很久以前,我常常浏览各种网站,被首屏中转动的对象和具有纵深感的动画深深吸引,不禁惊叹“好厉害!”。那时我心想“我也想做出这样的东西!”,于是便开始尝试使用Three.js和Blender。

怀着这样的憧憬进入Liberogic公司,但说实话……最近的工作大多是业务系统应用和无头CMS搭建等更为踏实的开发(笑)。别误会,我可没有贬低的意思哦~!

如今已经步入第4个年头,我想一边回想当年对“会动的Web”的憧憬,一边轻松地回顾一下WebGL的基础知识。

什么是WebGL

WebGL是一种在网站上显示3D图形的技术,Chrome、Firefox、Safari等所有主流浏览器均可运行。

早期主流是Flash Player等插件,但在智能手机上难以运行,这是一个问题。

与此相比,WebGL原生支持,因此可以说它是随后到来的开辟移动时代3D表现的技术。

实际操作一下

用 Three.js 在浏览器中显示 3D 内容

Three.js 是一个可以使用 JavaScript轻松创建 3D 内容的库,并且可以商用。

首先,作为 WebGL 的基本概念,需要 Renderer、Scene 和 Camera。

Renderer 是 Three.js 的主要对象。将 Scene 传入 Camera 后,位于摄像机视锥体内的 3D Scene 部分会以 2D 图像的形式被 Renderer 渲染(绘制)到画布上。

WebGL的概念,以及Renderer、Scene、Camera之间的关系
const scene = new THREE.Scene();

const camera = new THREE.PerspectiveCamera(
  1000, // 視野角
  window.innerWidth / window.innerHeight, // 側面
  75, // 近く
  1000 // 遠い
);
camera.position.set(0, 0, 400);

//マウスで制御
const controls = new OrbitControls(camera, document.body);

//html側の<canvas id="myCanvas"></canvas>を取得
const renderer = new THREE.WebGLRenderer({
  canvas: document.querySelector("#myCanvas"),
  antialias: true,
});

//setSize()メソッドでサイズを設定
renderer.setSize(window.innerWidth, window.innerHeight);
//背景色も変更可能
renderer.setClearColor("#000")

//htmlの<canvas id="myCanvas"></canvas>へ流し込み
document.body.appendChild(renderer.domElement);

另外,3D 立方体部分使用称为网格(Mesh)的显示对象来创建。要创建网格,需要准备几何体(形状)和材质(素材)。

//ジオメトリ(立方体)
const geometry = new THREE.BoxGeometry(100, 100, 100)

//マテリアル(色)
const material = new THREE.MeshNormalMaterial
const box = new THREE.Mesh(geometry, material);
//Sceneに追加
scene.add(box);

//ライト
const light = new THREE.DirectionalLight(0xffffff, 1);
light.position.set(1, 1, 1);
//Sceneに追加
scene.add(light);

最后添加动画。

本次将省略周围粒子效果的实现!

function animate() {
  requestAnimationFrame(animate);

  box.rotation.x += 0.005;
  box.rotation.y += 0.005;
  renderer.render(scene, camera);
}

animate()

将设置好的 camera,以及包含 geometry、material 和 light 的 scene 进行渲染后,即可在浏览器中显示。

显示视频文字记录(转录文本)(日语)

00:00 (直方体のジオメトリが3Dレンダリングされてブラウザに表示されている)

尝试使用 Blender 创建 3D 建模

Blender是一款开源的集成软件,免费涵盖3D建模、动画、渲染、游戏开发和视频编辑等3D制作的全部流程。仅靠Blender无法制作WebGL网站。

与Three.js的概念相同,在Blender中同样通过网格对象创建形状,并通过材质设置颜色和物体的质感。随后使用灯光调整光照和阴影效果,并调整摄像机的位置和朝向进行渲染。

通过调整面、线和点来塑造网格对象的形状。
使用材质节点(Material Nodes)添加颜色和纹理。

通过组合节点,可以实现渐变效果、金属质感或发光效果,从而打造逼真的材质质感。

参考:https://www.youtube.com/watch?v=DsNZzUZPhw4

在浏览器中使用Three.js显示用Blender制作的3D模型

将在Blender中制作的3D模型导出为.glb文件,并集成到Three.js中。

从Three.js库中导入OrbitControls、GLTFLoader和DRACOLoader各项功能。

OrbitControls是用于通过鼠标控制摄像机的工具类,GLTFLoader和DRACOLoader则分别用于加载GLTF格式的3D模型以及其压缩版本DRACO格式的3D模型。

我在浏览器中显示了建模的苹果!

不过,将在Blender中创建的模型通过Three.js在浏览器中显示时,由于渲染环境的差异和材质的兼容性,颜色和纹理可能看起来有所不同。要达到预期的外观,需要进行一些调整。

显示视频文字记录(转录文本)(日语)

00:00 (Blenderで作成したりんごのモデリングをThree.jsでブラウザ表示した様子)

平时的项目主要是CMS对接和业务应用的前端设计 / 开发,我自己的工作中接触3D表现的机会已经少了很多。

不过,像这样动手玩一玩,我再次感受到“果然很有意思”。

正因为怀有那时对动态Web的向往,我或许也自然而然地被现代技术所吸引。

好,今天也来试试Next和Nuxt!

回到工作现场,我将以另一种形式继续制作动态Web。 🚀

撰写本文的人

主要从事标记(Markup)工作,并使用 JavaScript、React 和 Next.js 进行前端开发。看到自己参与的网站顺利上线,我会非常开心!爱好是弹吉他。喜欢猫和烤红薯🐱🍠

Hirappi

前端工程师 / 2022年入职

查看此员工的文章

以稳健的团队体制和迅速的应对能力为傲

Liberogic 的资深团队积极推动项目,因此深受客户好评。
我们致力于合理配置项目经理与总监,确保整个项目顺利推进。 我们采用按需投入的方式,避免不必要的全员投入导致成本增加,合理分配资源、人尽其才。同时,我们在掌握业务内容、制作与提交报价方面的速度也广受好评。

※ 当社不积极开展 SES 类驻场业务,敬请谅解。

您可以使用 Slack、Teams、Redmine、Backlog、Asana、Jira、Notion、Google Workspace、Zoom、Webex 等几乎所有主流的项目管理工具和聊天工具。

Web 方面的烦恼,欢迎随时咨询。

案例分析