Topics

当年我尝试实现我的 3D 表达梦想(WebGL)时——一段关于使用 Three.js 和 Blender 的摸索经历

  • column

过去,当我浏览各种网站时,我总是被第一眼看到的动态物体和具有深度感的动画所吸引,不禁发出“哇!”的惊叹。那时我就想,“我也想做出这样的东西!”Three.js或者Blender我曾经尝试过。

我当初怀着无比的敬佩之情加入Liberlogic,但最终……最近我主要从事一些更扎实的实施工作,比如构建业务应用程序和Headless CMS(笑)。我并不是想贬低他们什么的!

现在我们已经进入第四年了,我回想起当时我对“动态网络”的渴望。WebGL我想简要介绍一下周边地区的基本情况。

什么是WebGL?

什么是WebGL?用于在网站上显示 3D 图形的技术它适用于所有主流浏览器,包括 Chrome、Firefox 和 Safari。

很久以前,像 Flash Player 这样的插件很常见,但它们存在难以在智能手机上运行的问题。

在这方面,WebGL 得到了原生支持,所以接下来开创移动时代3D表达技术先河的技术也可以说……

我真的试过了

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

Three.js使用 JavaScript一个无商标限制的库,让您可以轻松创建 3D 内容。

首先,就 WebGL 概念而言,你需要渲染器、场景和摄像机。

Renderer 是 Three.js 中的主要对象。SceneCamera相机视锥体Renderer3D 内Scene该部件将以 2D 图像的形式渲染(绘制)在画布上。

WebGL概念,渲染器、场景和摄像机之间的关系
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.add(box);

//光源

const light = new THREE.DirectionalLight(0xffffff, 1);

light.position.set(1, 1, 1);

//添加到场景

scene.add(light);

最后,添加动画效果。

这次我将省略周围粒子的实现!

function animate() {
  requestAnimationFrame(animate);

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

animate()

当您使用设定好的摄像机、几何体、材质和灯光渲染场景时,它将在浏览器中绘制出来。

查看视频文字稿(日语)

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

使用 Blender 创建 3D 模型

混合器免费、开源、集成的软件,涵盖整个 3D 制作流程,包括 3D 建模、动画、渲染、游戏开发和视频编辑。单靠Blender无法创建WebGL网站。

Blender 使用与 Three.js 相同的概念,使用网格对象创建形状,使用材质添加颜色和纹理,使用灯光调整光线照射和投射阴影的方式,并调整相机位置和方向以执行渲染。

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

你可以通过组合节点来创建逼真的纹理,例如渐变、金属效果和发光效果。

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

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

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

OrbitControlsGLTFLoaderDRACOLoader从 Three.js 库中导入每个函数。

OrbitControls是一个用于通过鼠标控制相机的实用程序,GLTFLoaderDRACOLoader分别是用于加载 GLTF 格式及其压缩版本 DRACO 格式的 3D 模型的实用程序。

模拟的苹果现在显示在浏览器中了!

但是,当我使用 Three.js 在浏览器中显示用 Blender 创建的模型时,渲染环境和材质兼容性的差异颜色和纹理会因设置不同而有所差异,因此您可能需要进行一些调整才能获得想要的效果。

查看视频文字稿(日语)

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

我的日常工作涉及 CMS 集成和业务应用程序的前端设计/构建,因此我在自己的工作中很少接触到 3D 表现形式。

但是当我这样玩的时候,我又一次意识到这真的很有趣。

那时候移动网络或许正是因为他对过去的崇敬,他才自然而然地被现代科技所吸引。

今天又是 Next 和 Nuxt!

以另一种形式重返该网站移动网络我一定能成功。🚀

撰稿人

我使用 JavaScript、React 和 Next.js 进行前端开发,专注于标记语言。看到自己参与开发的网站成功上线,我感到非常开心!我的爱好是弹吉他。我喜欢编写代码,也喜欢演奏代码!

Hiratchi

前端工程师 / 2022年入职

查看这位员工的文章

我们以可靠的团队结构和快速的响应能力而自豪。

在 Liberogic,我们经验丰富的员工积极推动项目进展,这也是我们受到客户高度评价的原因。
我们确保项目经理和主管得到合理分配,以确保整个项目的顺利进行。 我们避免因全额承诺而导致不必要的成本增加,并将资源分配给合适的人员和合适的岗位,并以快速掌握工作内容、创建和提交预算而闻名。

请注意,我们不积极参与SES式的现场工作。

我们支持几乎所有主流的项目管理和聊天工具,包括 Slack、Teams、Redmine、Backlog、Asana、Jira、Notion、Google Workspace、Zoom 和 Webex。

如果您有任何与网络相关的问题,请联系我们。

案例研究