今天我们来用ThreeJS的库实现一个波纹粒子效果,我们用到的ThreeJS的库有CanvasRenderer.js,OrbitControls.js,Projector.js,stats.min.js和three.js。这些库都是不可或缺的,我们先来看看实现的效果,如下图所示。

  我们再来看看项目结构是怎么样的,项目结构如下图所示。

我们的效果全部写在了index.html里,现在我们直接贴出index.html的代码,同学们可以直接拿来运行,代码如下。

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>演示页面</title>
<script src="three.js"></script>
<script src="Projector.js"></script>
<script src="CanvasRenderer.js"></script>
<script src="stats.min.js"></script>
<script src="OrbitControls.js"></script>
</head>
<body>
</body>
<script>
var SEPARATION = 200,
AMOUNTX = 60,
AMOUNTY = 60;
var container, stats;
var camera, scene, renderer, controls;
var particles, particle, count = 0;
var windowHalfX = window.innerWidth / 2;
var windowHalfY = window.innerHeight / 2;
var raycaster = new THREE.Raycaster();
var mouse = new THREE.Vector2(); function init() {
container = document.createElement('div');
document.body.appendChild(container);
camera = new THREE.PerspectiveCamera(75, window.innerWidth / window.innerHeight, 1, 10000);
scene = new THREE.Scene(); /**
* 设置光源
* */
//点光源
var point = new THREE.PointLight(0xffffff);//白光
point.position.set(1200, 1200, 1200);//点光源位置
scene.add(point);//点光源添加进场景
//环境光
var ambient = new THREE.AmbientLight(0x999999);//白光
scene.add(ambient);//环境光添加进场景 //模型
var cubeGeometry = new THREE.CubeGeometry(1000, 1000, 1000);
var cubeMaterial = new THREE.MeshLambertMaterial({
color:0xffff00
//side:THREE.DoubleSide
});//材质对象
var cubeMesh = new THREE.Mesh(cubeGeometry, cubeMaterial);//网格模型对象
cubeMesh.translateY(500);
scene.add(cubeMesh);//正方体网格模型添加到场景中 //粒子
particles = new Array();
var PI2 = Math.PI * 2;
var material = new THREE.SpriteCanvasMaterial({
color: 0xffffff,
program: function(context) {
context.beginPath();
context.arc(0, 0, 0.5, 0, PI2, true);
context.fill();
}
}); var i = 0;
for (var ix = 0; ix < AMOUNTX; ix++) {
for (var iy = 0; iy < AMOUNTY; iy++) {
particle = particles[i++] = new THREE.Sprite(material);
particle.position.x = ix * SEPARATION - ((AMOUNTX * SEPARATION) / 2);
particle.position.z = iy * SEPARATION - ((AMOUNTY * SEPARATION) / 2);
scene.add(particle);
}
} /**
* 创建渲染器对象
* */
renderer = new THREE.CanvasRenderer();
renderer.setPixelRatio(window.devicePixelRatio);
renderer.setSize(window.innerWidth, window.innerHeight);
container.appendChild(renderer.domElement); window.addEventListener('resize', onWindowResize, false); //交互控制器
/**
* 鼠标键盘事件监听器
* */
controls = new THREE.OrbitControls(camera, renderer.domElement);
controls.enableDamping = true;
controls.dampingFactor = 0.1;
controls.screenSpacePanning = true;
controls.minDistance = 0;
controls.maxDistance = 5000;
controls.maxPolarAngle = 2*Math.PI; /**
* 模型拾取
* */
mouse.x = -10000;
mouse.y = -10000; function onMouseMove( event ) {
// calculate mouse position in normalized device coordinates
// (-1 to +1) for both components
mouse.x = ( event.clientX / window.innerWidth ) * 2 - 1;
mouse.y = - ( event.clientY / window.innerHeight ) * 2 + 1;
} window.addEventListener( 'mousemove', onMouseMove, false );
} function pickUp() {
// update the picking ray with the camera and mouse position
raycaster.setFromCamera( mouse, camera );
// calculate objects intersecting the picking ray
var intersects = raycaster.intersectObjects( scene.children );
for ( var i = 0; i < intersects.length; i++ ) {
intersects[ i ].object.material.color.set( 0xff00ff );
}
if(intersects.length === 0){
scene.children[2].material.color.set( 0xffff00 );
for(var i=3; i<scene.children.length; i++){
scene.children[i].material.color.set( 0xffffff );
}
}
renderer.render( scene, camera );
} function onWindowResize() {
windowHalfX = window.innerWidth / 2;
windowHalfY = window.innerHeight / 2;
camera.aspect = window.innerWidth / window.innerHeight;
camera.updateProjectionMatrix();
renderer.setSize(window.innerWidth, window.innerHeight);
} var rad = 0;
function render() {
camera.position.set(2600, 500, 2600);
camera.up = new THREE.Vector3(0, 1, 0);
camera.lookAt(new THREE.Vector3(0, 500, 0)); var i = 0;
for (var ix = 0; ix < AMOUNTX; ix++) {
for (var iy = 0; iy < AMOUNTY; iy++) {
particle = particles[i++];
particle.position.y = (Math.sin((ix + count) * 0.2) * 500) +
(Math.sin((iy + count) * 0.2) * 500);
particle.scale.y = (Math.sin((ix + count) * 0.3) + 1) * 3 +
(Math.sin((iy + count) * 0.3) + 1) * 3;
particle.scale.x = (Math.sin((ix + count) * 0.3) + 1) * 3 +
(Math.sin((iy + count) * 0.3) + 1) * 3;
}
scene.children[2].translateY(Math.cos(ix + count/2)*5);
}
//模型旋转
scene.children[2].rotateY(Math.PI/180);
camera.position.x = 2600*Math.cos(Math.PI/180*rad);
camera.position.z = -2600*Math.sin(Math.PI/180*rad);
//点光源位置
scene.children[0].position.x = 1200*Math.cos(Math.PI/180*rad+Math.PI*0.1);
scene.children[0].position.z = -1200*Math.sin(Math.PI/180*rad+Math.PI*0.1); controls.update();
renderer.render(scene, camera);
count += 0.1;
rad += 0.2;
} function animate() {
requestAnimationFrame(animate);
render();
pickUp();
} init();
animate();
</script>
</html>

  我们分析一下段代码,首先我们看到requestAnimationFrame,这是主循环,我们在init()初始化函数中往scene场景中添加了particle粒子,这些粒子是在XoZ平面上均匀网格散布的。然后我们主循环每次render()都改变粒子的Y坐标,修改的规则是通过sin函数进行Y轴向扰动。每次重绘我们都修改Y坐标,就实现了粒子的波动特效。
  代码很简单,希望能帮助大家做出一套粒子波动的背景特效。鲫鱼非常愿意和大家讨论学习WebGL和ThreeJS的技术,欢迎大家留言,谢谢。本文系原创,如需引用请注明出处:https://www.cnblogs.com/ccentry/p/10125686.html

ThreeJS实现波纹粒子效果的更多相关文章

  1. 超炫的HTML5粒子效果进度条 VS 如何规范而优雅地code

    最近瞎逛的时候发现了一个超炫的粒子进度效果,有多炫呢?请擦亮眼镜!   // _this.ch){ _this.particles.splice(i, 1); } }; this.Particle.p ...

  2. 简直要逆天!超炫的 HTML5 粒子效果进度条

    我喜欢粒子效果作品,特别是那些能够应用于实际的,例如这个由 Jack Rugile 基于 HTML5 Cavnas 编写的进度条效果.看着这么炫的 Loading 效果,即使让我多等一会也无妨:)你呢 ...

  3. CodePen 作品秀:Canvas 粒子效果文本动画

    作品名称——Shape Shifter,基于 Canvas 的粒子图形变换实验.在页面下方的输入框输入文本,上面就会进行变换出对应的粒子效果文本动画. CodePen 作品秀系列向大家展示来自 Cod ...

  4. iOS开发——UI进阶篇(十八)核心动画小例子,转盘(裁剪图片、自定义按钮、旋转)图片折叠、音量震动条、倒影、粒子效果

    一.转盘(裁剪图片.自定义按钮.旋转) 1.裁剪图片 将一张大图片裁剪为多张 // CGImageCreateWithImageInRect:用来裁剪图片 // image:需要裁剪的图片 // re ...

  5. 能产生粒子效果的CAEmitterLayer

    能产生粒子效果的CAEmitterLayer 下雪效果: // // RootViewController.m // Cell // // Copyright (c) 2014年 Y.X. All r ...

  6. cocos基础教程(8)粒子效果

    简介 粒子系统是指计算机图形学中模拟特定现象的技术,它在模仿自然现象.物理现象及空间扭曲上具备得天独厚的优势,为我们实现一些真实自然而又带有随机性的特效(如爆炸.烟花.水流)提供了方便. 粒子属性 一 ...

  7. 用仿ActionScript的语法来编写html5——第八篇,图片处理+粒子效果

    用仿ActionScript的语法来编写html5系列开发到现在,应该可以做出一些东西了,下面先来研究下图片的各种效果预览各种效果看下图效果和代码看这里,看不到效果的请下载支持html5的浏览器 ht ...

  8. iOS 开发之粒子效果

    本文由糖炒小虾.Benna翻译 ,校对:sai.u0u0.iven.子龙山人 iOS 5中的UIKit粒子系统教程 Ray的话:这是第15篇.也是最后一篇<iOS 5 盛宴>中的iOS 5 ...

  9. cocos2d粒子效果

    第9章 粒子效果 游戏开发者通常使用粒子系统来制作视觉特效.粒子系统能够发射大量细小的粒子并对他们进行渲染,而且效率要远高于渲染同样数目的精灵.粒子系统可以模拟下雨.火焰.雪.爆炸.蒸气拖尾以及其他多 ...

随机推荐

  1. 原生 JS 的 Base64 转码

    JavaScript 原生提供两个 Base64 相关的方法: btoa():任意值转为 Base64 编码 atob():Base64 编码转为原来的值 注意:这两个方法不适合非 ASCII 码的字 ...

  2. Mac pycharm专业版安装以及破解方法

    1.先在Pycharm官网,或者直接输入网址:http://www.https://www.jetbrains.com/pycharm/ 2.修改hosts文件 sudo vim /etc/hosts ...

  3. 洛谷 P4011 孤岛营救问题【最短路+分层图】

    题外话:昨夜脑子昏沉,今早一调试就过了...错误有:我忘记还有墙直接穿墙过...memset初始化INF用错了数...然后手残敲错一个状态一直过不了样例...要是这状态去比赛我简直完了......or ...

  4. python decorator的本质

    推荐查看博客:python的修饰器 对于Python的这个@注解语法糖- Syntactic Sugar 来说,当你在用某个@decorator来修饰某个函数func时,如下所示: @decorato ...

  5. ubuntu安装pycharm并设置快捷方式

    一.tar.gz包安装 从官网下载压缩包 tar zxfv pycharm-professional-2017.3.3.tar.gz cd pycharm-2017.3.3 ./bin/pycharm ...

  6. 是否含有RTTI(运行时类型信息)是动态语言与静态语言的主要区别

    运行时类型信息代表类型信息和对内存的操作能力. 运行时类型信息是运行时系统的基础. 类型信息分为编译时类型信息和运行时类型信息两种: 静态语言的类型信息只在编译时使用和保留,在可执行文件中没有类型信息 ...

  7. macbook下 go 语言的 helloworld

    go语言开发的目录 一般go语言$GOPATH 目录约定有三个子目录: src 存放源代码(比如:.go .c .h .s等) pkg 编译后生成的文件(比如:.a) bin 编译后生成的可执行文件( ...

  8. ES6新特性2:变量的解构赋值

    本文摘自ECMAScript6入门,转载请注明出处. ES6允许按照一定模式,从数组和对象中提取值,对变量进行赋值,这被称为解构(Destructuring).不仅适用于var命令,也适用于let和c ...

  9. sqoop-1.4.7 搭建

    sqoop搭建环境:   jdk1.8    hadoop分布式集群(HDFS)     HIVE(看使用情况) 下载网址:http://sqoop.apache.org/ 建议: sqoop1.4. ...

  10. P1437 [HNOI2004]敲砖块

    题目描述 在一个凹槽中放置了 n 层砖块.最上面的一层有n 块砖,从上到下每层依次减少一块砖.每块砖 都有一个分值,敲掉这块砖就能得到相应的分值,如下图所示. 14 15 4 3 23 33 33 7 ...