使用3D引擎threeJS实现星空粒子移动效果

使用3D引擎threeJS实现星空粒子移动效果的完整攻略包含以下几个步骤:

步骤一:引入three.js

首先需要在代码中引入three.js这个库,代码如下:

<script src="https://cdn.bootcdn.net/ajax/libs/three.js/105/three.min.js"></script>

在引入这个库文件之后,我们需要准备canvas元素和相应的场景、相机等对象。

步骤二:准备canvas元素和相应的场景、相机等对象

在使用three.js创建3D场景之前,需要先创建canvas和渲染器对象,其中renderer对象是three.js中三维空间显示的核心,代码如下:

<canvas id="canvas"></canvas>

<script>
const canvas = document.querySelector("#canvas");
const renderer = new THREE.WebGLRenderer({
    canvas,
    alpha: true
});

renderer.setPixelRatio(window.devicePixelRatio);
renderer.setSize(window.innerWidth, window.innerHeight);
</script>

接着需要创建scene、camera和geometry等对象,代码如下:

const scene = new THREE.Scene();

const camera = new THREE.PerspectiveCamera(60, window.innerWidth / window.innerHeight, 1, 10000);
camera.position.z = 1200;

const particles = new THREE.Geometry();
const material = new THREE.PointsMaterial({
    size: 5,
    color: 0xffffff
});

这里我们创建了一个相机,放置在z=1200的位置,size为5,颜色为白色的材质类型为PointsMaterial,这个类可以定义点材质的颜色、大小等,也是实现星空粒子移动效果的关键。

步骤三:创建星空粒子

接下来我们需要在场景中创建星空粒子,代码如下:

for (let i = 0; i < 10000; i++) {
  const particle = new THREE.Vector3(
    Math.random() * 2000 - 1000,
    Math.random() * 2000 - 1000,
    Math.random() * 2000 - 1000
  );
  particles.vertices.push(particle);
}
const particleSystem = new THREE.Points(particles, material);
scene.add(particleSystem);

在这段代码中,我们首先使用for循环创建了10000个不同坐标的3D向量,这些向量分别被赋予在(x,y,z)三维坐标系中(-1000<=x,y,z<=1000)的位置上,这就产生了许多随机位置的星空粒子。最后使用Points对象将这些点聚集起来加入到场景中。

步骤四:制作星空移动效果

制作星空移动效果需要实现的是整个场景中所有粒子的移动。使用requestAnimationFrame在每帧都改变每个粒子的坐标,给人以在一个巨大的空旷的宇宙中缓缓飘浮的感觉,代码如下:

function animate() {
    requestAnimationFrame(animate);

    let time = Date.now() * 0.001;

    particleSystem.rotation.x = time * 0.25;
    particleSystem.rotation.y = time * 0.5;

    for (let i = 0; i < particles.vertices.length; i++) {
        let particle = particles.vertices[i];
        if (particle.z < -1000) {
            particle.z += 2000;
        }
        particle.z -= Math.random() * 3;
    }

    particles.verticesNeedUpdate = true;

    renderer.render(scene, camera);
}

animate();

在这段代码中,每帧都改变粒子的z坐标,实现了粒子的往后移动的效果,同时也会不断的调整每个粒子的旋转角度,通过Math.random()方法生成随机变化的方式,实现星空的自然效果。

示例一

接下来,以一个示例进行说明,展示如何在不同的条件下创建和定制使用three.js库的星空场景,并创建不同的星空效果。首先,在此示例中,我们在场景中添加了灯光和背景色,代码如下:

const renderer = new THREE.WebGLRenderer({ canvas: document.querySelector("canvas"), antialias: true });
renderer.setPixelRatio(window.devicePixelRatio);
renderer.setSize(window.innerWidth, window.innerHeight);
renderer.setClearColor("#000000");

const scene = new THREE.Scene();
const camera = new THREE.PerspectiveCamera(75, window.innerWidth / window.innerHeight, 10, 20000);
camera.position.z = 1000;

// 点光源
const light = new THREE.PointLight(0xffffff, 1, 800);
scene.add(light);

// 星空
const starsGeometry = new THREE.Geometry();
for (let i = 0; i < 10000; i++) {
  const star = new THREE.Vector3(
    Math.random() * 2000 - 1000,
    Math.random() * 2000 - 1000,
    Math.random() * 2000 - 1000
  );
  starsGeometry.vertices.push(star);
}
const starsMaterial = new THREE.PointsMaterial({
  color: 0xffffff,
  size: 5,
  opacity: 0.6
});
const starField = new THREE.Points(starsGeometry, starsMaterial);
scene.add(starField);

示例二

接下来,以一个示例进行说明,展示如何使用代码生成文本,并在three.js场景中进行显示。首先需要引入CSS3DRenderer.jslibrary,代码如下:

<script src="https://cdn.bootcdn.net/ajax/libs/three.js/r82/three.js"></script>
<script src="https://cdn.bootcdn.net/ajax/libs/three.js/r82/CSS3DRenderer.js"></script>

然后我们开始创建文本内容,代码如下:

const contentDiv = document.createElement("div");
contentDiv.id = "content";
contentDiv.innerHTML = "<p>Hello World!</p>";
contentDiv.style.position = "absolute";
contentDiv.style.top = "0";
contentDiv.style.left = "0";
document.body.appendChild(contentDiv);

为了将这个div中的DOM元素添加到three.js场景中,需要将它封装为CSS3DObject对象:

const css3DObject = new THREE.CSS3DObject(contentDiv);
css3DObject.position.set(-200, 200, 100);
scene.add(css3DObject);

在这个示例中,我们创建了一个<div>,并在其中添加文本内容。然后,我们创建了一个CSS3DObject对象,并将其添加到场景中。最后通过修改css3DObject对象的position属性,实现将文本对象放置在场景中任意位置,与星空粒子效果一同实现一个多彩的三维场景。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:使用3D引擎threeJS实现星空粒子移动效果 - Python技术站

(0)
上一篇 2023年6月11日
下一篇 2023年6月11日

相关文章

  • 记录–你可能忽略的10种JavaScript快乐写法

    这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 前言 代码的简洁、美感、可读性等等也许不影响程序的执行,但是却对人(开发者)的影响非常之大,甚至可以说是影响开发者幸福感的重要因素之一; 了解一些有美感的代码,不仅可以在一定程度上提高程序员们的开发效率,有些还能提高代码的性能,可谓是一举多得; 笔者至今难以忘记最开始踏入程序员领域时接触的一段Li…

    JavaScript 2023年4月18日
    00
  • 解决页面js接受Long型损失精度问题(最新解决方案)

    解决页面JS接受Long型损失精度问题(最新解决方案) 在前后端分离的架构下,我们经常需要通过网络传输Long类型的数据,在前端进行处理。但是,由于JS中Number类型采用IEEE 754双精度浮点数表示,会存在精度损失的问题。而Long类型的数据更倾向于采用Java或C++等强类型语言进行处理,因此我们需要找到一种前端解决方案。 方案一:采用BigInt…

    JavaScript 2023年5月28日
    00
  • Vue联动Echarts实现数据大屏展示

    下面是“Vue联动Echarts实现数据大屏展示”的完整攻略。 一、什么是Vue联动Echarts Vue是一款流行的前端框架,Echarts是一款流行的数据可视化库。Vue联动Echarts的实现,就是将Vue与Echarts进行结合,实现数据的动态展示和交互。 二、如何实现Vue联动Echarts 1. 引入Echarts 在项目中引入Echarts库,…

    JavaScript 2023年6月11日
    00
  • JavaScript 对象合并的几种方法小结

    针对“JavaScript 对象合并的几种方法小结”,以下是详细的攻略。 什么是JavaScript对象合并 JavaScript对象合并,指的是将两个或多个对象合并成一个新的对象。 在JavaScript中,合并对象是一种常见的操作,它可以将多个对象中的属性和方法合并到一起,以创建一个新的对象,这样我们就可以方便地管理和操作这些属性和方法。 方法1:Obj…

    JavaScript 2023年5月27日
    00
  • JS中内存泄漏的几种情况

    JavaScript 中的内存泄漏是指程序中使用的内存不再被需要却没有被释放,最终导致浏览器或者 Node.js 进程使用的内存越来越大,直到程序崩溃或者系统运行缓慢。 在 JavaScript 中,内存泄漏通常是由于变量、对象、闭包、事件监听器等长期存在而没有被释放引起的。这些长期存在的引用会阻止垃圾回收器回收内存,最终导致内存泄漏。     内存泄漏通常…

    JavaScript 2023年5月9日
    00
  • JavaScript对象属性设置和屏蔽技巧

    关于JavaScript对象属性设置和屏蔽技巧,我从下面的几个方面详细阐述: 禁止增加属性 我们可以使用 Object.preventExtensions() 方法来禁止对象增加属性。如果我们尝试给一个被禁止增加属性的对象增加属性,就会失败并抛出错误。 const obj = { a: 1, b: 2 }; Object.preventExtensions(…

    JavaScript 2023年5月27日
    00
  • js获取本日、本周、本月的时间代码

    下面是获取本日、本周、本月的时间代码的完整攻略。 获取本日时间代码 我们可以使用JavaScript Date对象中的方法获取当前本日的时间。首先,我们需要创建一个Date对象,然后使用该对象的方法获取日期、月份和年份。下面是示例代码: const today = new Date(); const year = today.getFullYear(); c…

    JavaScript 2023年5月27日
    00
  • 用户名、密码等15个常用的js正则表达式

    下面我就为大家详细讲解一下”用户名、密码等15个常用的js正则表达式”的攻略。 1. 用户名的正则表达式 用户名通常由大小写字母、数字、下划线和连字符组成,长度一般为4-16个字符。可以用如下正则表达式进行匹配: var reg = /^[a-zA-Z0-9_-]{4,16}$/; 其中,^表示字符串的开头,$表示字符串的结尾。[a-zA-Z0-9_-]表示…

    JavaScript 2023年6月10日
    00
合作推广
合作推广
分享本页
返回顶部