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

yizhihongxing

使用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日

相关文章

  • JS 页面内容搜索,类似于 Ctrl+F功能的实现代码

    实现类似于 Ctrl+F 功能的 JS 页面内容搜索,需要基于两个核心 API:window.find() 和 window.getSelection()。 window.find() window.find() 方法用于在当前页面中查找指定的字符串,并返回一个布尔值表示是否检索到该字符串。该方法可以接收三个参数,依次为: 要查找的字符串 是否区分大小写(可…

    JavaScript 2023年5月19日
    00
  • 为什么JavaScript没有块级作用域

    为什么JavaScript没有块级作用域 在JavaScript中,块级作用域指的是使用一对花括号({})创建的代码块,在这个代码块内声明的变量只能在代码块内部访问,并且在代码块外部无法访问。但是,JavaScript没有真正的块级作用域,这意味着在块级作用域之外仍然可以访问在块级作用域内部声明的变量。这是由于JavaScript采用了词法作用域(也称为静态…

    JavaScript 2023年6月10日
    00
  • javascript ajax类AJAXRequest2007-12-31 更新

    JavaScript AJAX类AJAXRequest2007-12-31是一种用于发送AJAX请求的JavaScript类。使用AJAXRequest类可以实现在不刷新页面的情况下,通过后台服务器获取数据并动态更新网页的应用。 下面是使用该类的详细攻略: 1. 引入AJAXRequest类 在使用AJAXRequest类之前,需要将类的代码引入到网页中。可…

    JavaScript 2023年6月10日
    00
  • JavaScript引入方式深入解读

    JavaScript引入方式深入解读 想要在网页中使用JavaScript,我们需要将JavaScript代码引入到网页中。JavaScript有三种引入方式:内嵌、外部引入和异步引入,下面将对这三种引入方式进行详细讲解。 内嵌引入 内嵌引入是将JavaScript代码直接嵌入到HTML代码中,使用<script>标签将JavaScript代码包…

    JavaScript 2023年5月27日
    00
  • BootStrap Validator使用注意事项(必看篇)

    BootStrap Validator使用注意事项(必看篇) 作为一个前端开发者,你可能会经常使用Bootstrap框架来开发网站。其中,Bootstrap Validator是Bootstrap框架中一个非常有用的jQuery插件,可以用于表单验证。在使用Bootstrap Validator时,需要注意以下事项: 1. 引用依赖文件 在使用Bootstr…

    JavaScript 2023年6月10日
    00
  • Javascript 面向对象之重载

    Javascript 面向对象之重载 什么是重载 重载(Overloading)指的是一个类中多个方法的名称相同,但是参数列表不同(参数类型、参数个数、参数顺序),这样的方法称为重载方法。在使用时,编译器会根据参数数量、类型和顺序来决定调用哪个方法。 然而在 Javascript 中,由于其灵活的语言特性,本身不支持函数的重载。 如何实现重载 通过 argu…

    JavaScript 2023年5月27日
    00
  • JS字符串和数组如何实现相互转化

    JS字符串和数组可以通过内置的方法相互转化。 1. 字符串转数组 字符串可以使用 split() 方法转换为数组。split() 方法将字符串按照指定的分隔符分割成多个子字符串,并将子字符串存储到一个新的数组中。 语法如下: string.split(separator, limit) separator 是分隔符,可以是字符串或正则表达式。如果省略分隔符,…

    JavaScript 2023年5月28日
    00
  • JavaScript中的16进制字符(改进)

    JavaScript中的16进制字符(改进) 在JavaScript中,我们可以使用16进制字符来表示字符或者数字。而由于16进制字符的特殊性,有时会导致一些诡异的问题,本文将为大家介绍如何使用JavaScript中的16进制字符。 1. 什么是16进制字符 在JavaScript中,16进制字符是以\x开头,后跟两个16进制数字所代表的字符。例如,’\x4…

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