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

相关文章

  • Js+Jq获取URL参数的集中方法示例代码

    获取 URL 参数是前端开发中经常用到的操作,下面是使用 JavaScript 和 jQuery 获取 URL 参数的示例代码及详细说明。 JavaScript 获取 URL 参数 1. 使用 split 方法和正则表达式分隔字符串 JavaScript 中可以使用 split 方法和正则表达式来截断字符串,然后将获取到的参数与对应的值存储在一个对象中。示例…

    JavaScript 2023年6月10日
    00
  • 实现在 Chrome 中执行 JavaScript 代码

    要在 Chrome 中执行 JavaScript 代码,有以下几种方法: 方法一:使用控制台 打开Chrome浏览器; 打开开发者工具(快捷键为F12或Ctrl+Shift+I); 在开发者工具中选择控制台选项卡; 在控制台中输入JavaScript代码,并按Enter键执行。 例如,在控制台中输入以下代码,即可在页面中弹出”Hello World!”的对话…

    JavaScript 2023年5月27日
    00
  • javascript 操作符(~、&、|、^、<<、>>)使用案例

    JavaScript 操作符使用攻略 JavaScript 中提供了丰富的操作符,包括算术、比较、逻辑、位移、位运算等等,其中比较少用到的是位运算。本文将详细讲解与位运算相关的操作符 ~、&、|、^、<<、>>,并且提供两个常见的使用案例。 理解位运算 位运算指的是直接对二进制数字进行运算,它常常被用在对整型数字进行一些特殊的…

    JavaScript 2023年5月18日
    00
  • Element的el-tree控件后台数据结构的生成以及方法的抽取

    生成后台数据结构: 首先,我们需要明确el-tree控件所需要的数据格式,它要求数据使用树形结构进行展示,每一项数据包含以下属性: label:节点描述 children:子节点数据,是一个数组,也可以为空 接着,我们需要对后台的原始数据进行格式化处理,使其可以被el-tree控件所展示。常见的处理方式是使用递归的方式将原始数据转换为树形结构,具体过程如下:…

    JavaScript 2023年6月10日
    00
  • JavaScript深拷贝与浅拷贝实现详解

    JavaScript深拷贝与浅拷贝实现详解 什么是拷贝? 在JavaScript中,我们经常需要将对象或者数组进行复制操作,这被称为拷贝。在拷贝过程中,我们需要注意两个概念:浅拷贝和深拷贝。 什么是浅拷贝? 浅拷贝仅仅是复制了对象或数组的引用,而并没有克隆对象或数组。也就是说,对于被拷贝的对象或数组,它们的属性仍然指向原对象或数组中的属性。浅拷贝通常使用的方…

    JavaScript 2023年6月10日
    00
  • 如何用JS追踪用户

    下面是关于如何用JS追踪用户的完整攻略: 1. 获取用户信息 我们可以使用JS来获取用户的一些相关信息,如用户的浏览器信息、设备信息、操作系统信息等。例如,我们可以使用以下代码来获取用户的浏览器名称及版本: var browser = navigator.userAgent.toLowerCase(); if (browser.indexOf("m…

    JavaScript 2023年5月27日
    00
  • JavaScript中解决多浏览器兼容性23个问题的快速解决方法

    作为网站作者,我们需要考虑到不同浏览器的兼容性问题。在 JavaScript 中,不同浏览器的兼容性问题比较常见,为了解决这些问题,我们需要使用一些常见的解决方法。下面是解决 JavaScript 中多浏览器兼容性问题的完整攻略: 1. 选择合适的文档模式 文档模式用于指定浏览器在解析网页时所采用的渲染模式,包括“标准模式”和“兼容模式”。在 HTML5 中…

    JavaScript 2023年6月10日
    00
  • 给html超链接设置事件不使用href来完成跳

    要给HTML超链接设置事件,不使用href来完成跳转,可以使用JavaScript中的event.preventDefault()方法来阻止默认行为,然后使用window.location方法来完成跳转。 具体实现步骤如下: 在HTML中设置一个<a>标签,没有href属性,但需要在标签中添加一个唯一标识符,如id属性,以便于在JavaScrip…

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