Topics

当年挑战3D表现(WebGL)的那些日子 ― 用Three.js和Blender玩耍的故事

  • column

曾经,我浏览过许多网站,被首屏上旋转的对象和具有纵深感的动画所吸引,心想"太棒了!"。那时我萌生了"我也想自己制作这样的效果!"的念头,有段时间尝试过Three.jsBlender

带着这样的憧憬加入了Liberogic,但从结果来说……最近的日子里,基本上都是在做业务系统应用或headless CMS构建这样相对务实的实现工作呢(笑)不是在吐槽啦~!

如今已经进入第四年,我想在回忆当初对"动态网络"的憧憬之际,轻轻回顾一下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 的主要对象。将SceneCamera传递给 Renderer 后,摄像机视椎体内Renderer中的 3D Scene部分将被渲染(绘制)成 2D 图像显示在画布上。

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 立方体。创建网格需要准备几何体(形状)和材质(纹理)。

//ジオメトリ(立方体)
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网站。

Blender和Three.js的概念相同,都是用网格对象创建形状,用材质添加颜色和物质纹理。然后通过光照调整光线和阴影效果,调整摄像机的位置和方向进行渲染。

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

通过组合节点,可以创建渐变效果、金属质感、发光效果等逼真的纹理。

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

在Blender中创建3D模型并使用Three.js在浏览器中显示

将Blender创建的3D模型导出为.glb文件,并将其集成到Three.js中。

从Three.js库中导入OrbitControlsGLTFLoaderDRACOLoader功能。

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

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

但是,当使用 Three.js 在浏览器中展示用 Blender 创建的模型时,由于渲染环境的差异以及材质的兼容性问题,色彩和纹理的外观会有所不同。要使其看起来符合预期,需要做一些调整。

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

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

每天的项目工作主要是 CMS 集成和业务应用的前端设计/构建,作为我自己的工作内容,接触 3D 表现的机会已经大幅减少了。

但是这样尝试着玩的话,我又一次地感受到"果然还是挺有趣的"。

正因为那时候对动态Web的憧憬,我或许才自然地被现代技术所吸引。

来吧,今天也要用 Next.js 和 Nuxt!

回到现场,继续用另一种形式创建动态Web。 🚀

本文作者

我主要从事以标记语言为中心,使用JavaScript、React、Next.js进行前端开发的工作。当我参与的网站顺利发布时,我会感到很高兴!我的爱好是弹吉他。喜欢猫和烤红薯🐱🍠

Hiratch

前端工程师 / 2022年入职

查看本员工的文章

安心的团队体制和迅速的反应能力是我们的优势

Liberogic 拥有经验丰富的员工团队,积极推进项目,因此获得了客户的高度评价。
我们会妥善分配项目经理和总监,确保整个项目顺利进行。 通过避免不必要的全职投入导致的成本增加,并采用适当配置人力资源的方式,从把握业务内容到估价的制作和提交速度都赢得了良好的口碑。

* 本公司不积极开展SES驻场工作等业务,敬请谅解。

Slack、Teams、Redmine、Backlog、Asana、Jira、Notion、Google Workspace、Zoom、Webex 等,您可以使用几乎所有主要的项目管理工具和沟通协作工具。

请咨询我们的网站相关问题。

案例分析