返回

让整个宇宙为你闪烁:用Three.js构建一个璀璨星系

前端

三体:在闪烁的宇宙中航行

刘慈欣的史诗科幻小说《三体》带我们踏上了一段穿越浩瀚宇宙的奇妙旅程。书中,我们与三体文明相遇,一个因其恒星系统的不稳定性而被迫在宇宙中漫游的先进外星人。宇宙本身被描绘成一个充满危险和未知的广阔空间,为我们提供了一个关于生存、进化和我们在这个无垠领域中的位置的深刻沉思。

通过本指南,我们将深入探讨如何使用Three.js,一个流行的JavaScript库,创建自己的闪烁的宇宙模型。我们将分解每个步骤,从创建基本场景到添加灯光和动画,从而构建一个交互式体验,让您探索宇宙的奇观。

认识 Three.js:打造宇宙建模的基石

Three.js 是一个强大的工具,可以让您轻松地在浏览器中创建和呈现 3D 图形。它提供了各种功能,包括:

  • 场景: 容纳所有对象的容器。
  • 相机: 用户的视角,用于查看场景。
  • 渲染器: 将场景转换为图像。
  • 几何体: 形状的定义,用于创建对象。
  • 材质: 定义对象外观的特性。
  • 纹理: 添加细节的图像。
  • 光照: 照亮场景。
  • 动画: 控制对象的运动。

从零开始:创建宇宙模型

第一步是创建我们闪烁的宇宙的容器——场景。接下来,我们需要设置一个相机,以便我们可以从特定的视角观察场景。最后,我们需要一个渲染器,将场景转换为可以在浏览器中查看的图像。

var scene = new THREE.Scene();
var camera = new THREE.PerspectiveCamera(75, window.innerWidth / window.innerHeight, 0.1, 1000);
camera.position.z = 5;
var renderer = new THREE.WebGLRenderer();
renderer.setSize(window.innerWidth, window.innerHeight);
document.body.appendChild(renderer.domElement);

现在,让我们为我们的宇宙添加一些内容。我们将创建一个球体,作为我们闪烁的恒星。

var geometry = new THREE.SphereGeometry(1, 32, 32);
var material = new THREE.MeshBasicMaterial({ color: 0xffffff });
var sphere = new THREE.Mesh(geometry, material);
scene.add(sphere);

点亮宇宙:添加灯光

为了让我们的宇宙模型更加逼真,我们需要添加一些光照。灯光将照亮场景,突出我们闪烁的恒星。

var light = new THREE.DirectionalLight(0xffffff, 1);
light.position.set(1, 1, 1).normalize();
scene.add(light);

让宇宙栩栩如生:添加动画

最后,为了让我们的宇宙模型栩栩如生,我们需要添加一些动画。这将使我们的恒星闪烁,为我们的场景增添活力。

function animate() {
  requestAnimationFrame(animate);

  sphere.rotation.y += 0.01;

  renderer.render(scene, camera);
}

animate();

将您的宇宙模型导出到 HTML

现在,我们已经构建了闪烁的宇宙模型,让我们将其导出到 HTML,以便我们可以轻松地将其分享和查看。

var exporter = new THREE.OBJExporter();

var result = exporter.parse(scene);

var html = "<html>\n<head>\n\n<script src=\"three.js\"></script>\n</head>\n<body>\n<script>\nvar scene = new THREE.Scene();\nvar camera = new THREE.PerspectiveCamera(75, window.innerWidth / window.innerHeight, 0.1, 1000);\ncamera.position.z = 5;\nvar renderer = new THREE.WebGLRenderer();\nrenderer.setSize(window.innerWidth, window.innerHeight);\ndocument.body.appendChild(renderer.domElement);\nvar geometry = new THREE.OBJLoader().parse(result);\nvar material = new THREE.MeshBasicMaterial({ color: 0xffffff });\nvar mesh = new THREE.Mesh(geometry, material);\nscene.add(mesh);\nvar light = new THREE.DirectionalLight(0xffffff, 1);\nlight.position.set(1, 1, 1).normalize();\nscene.add(light);\nfunction animate() {\n  requestAnimationFrame(animate);\n\n  mesh.rotation.y += 0.01;\n\n  renderer.render(scene, camera);\n}\nan】

常见问题解答

1. 如何控制恒星闪烁的速度?

答:您可以通过调整 animate() 函数中 sphere.rotation.y += 0.01; 行中的 0.01 值来控制恒星闪烁的速度。较高的值会导致更快的闪烁,而较低的值会导致更慢的闪烁。

2. 如何更改恒星的颜色?

答:您可以通过更改 var material = new THREE.MeshBasicMaterial({ color: 0xffffff }); 行中的 0xffffff 值来更改恒星的颜色。这是一个十六进制颜色代码,您可以将其更改为所需的任何颜色。

3. 如何添加多个恒星?

答:您可以通过重复 var sphere = new THREE.Mesh(geometry, material); 行来添加多个恒星。每行将创建一个新的球体,您可以将它们放置在不同的位置以创建星系或星云。

4. 如何添加纹理到恒星?

答:您可以通过使用 THREE.TextureLoader() 加载图像并将其应用于 var material = new THREE.MeshBasicMaterial({ color: 0xffffff }); 行中的材质来添加纹理到恒星。这将使恒星具有更逼真的外观。

5. 如何将我的宇宙模型导出为其他格式?

答:您可以使用 Three.js 导出器将您的宇宙模型导出为各种其他格式,例如 OBJ、JSON 和 STL。这使您可以轻松地将其导入其他应用程序或进行 3D 打印。