释放三维创造力:探索Three.js的奇迹(内含源码)

简介: 释放三维创造力:探索Three.js的奇迹(内含源码)


运行结果



代码解读


这段代码是一个使用Three.js创建交互式粒子系统的示例。下面对代码进行详解:

<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8">
    <title>Three.js Interactive Particle System Example</title>
    <style>
      body { margin: 0; }
      canvas { display: block; }
    </style>
  </head>
  <body>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/three.js/110/three.min.js"></script>
    <script>


在头部,我们设置了页面的标题,并引入了Three.js库。


// 创建场景
      var scene = new THREE.Scene();


在这里,我们创建了一个Three.js场景。


// 创建相机
      var camera = new THREE.PerspectiveCamera(75, window.innerWidth / window.innerHeight, 0.1, 1000);
      camera.position.z = 100;


接着,我们创建了一个透视相机,并将其位置设置为 z 轴上的 100。


// 创建渲染器
      var renderer = new THREE.WebGLRenderer();
      renderer.setSize(window.innerWidth, window.innerHeight);
      document.body.appendChild(renderer.domElement);


然后,我们创建了一个WebGL渲染器,并将其大小设置为窗口的宽度和高度。最后,将渲染器的canvas元素添加到网页的body中。


// 创建粒子系统
      var particleCount = 1000;
      var particles = new THREE.Geometry();
      for (var i = 0; i < particleCount; i++) {
        var particle = new THREE.Vector3(
          Math.random() * 200 - 100,
          Math.random() * 200 - 100,
          Math.random() * 200 - 100
        );
        particles.vertices.push(particle);
      }
      var particleMaterial = new THREE.PointsMaterial({ color: 0xffffff });
      var particleSystem = new THREE.Points(particles, particleMaterial);
      scene.add(particleSystem);


接下来,我们创建了一个粒子系统。首先定义了粒子数量(这里是1000个),然后使用循环生成了每个粒子的位置坐标。通过THREE.Vector3类创建了三维向量,并将其添加到particles对象的顶点数组中。然后,创建了一个用于渲染粒子的材质,并使用THREE.Points对象将粒子集合和材质组合起来。最后,将粒子系统添加到场景中。


// 交互事件监听器
      var raycaster = new THREE.Raycaster();
      var mouse = new THREE.Vector2();
      function onMouseMove(event) {
        event.preventDefault();
        mouse.x = (event.clientX / window.innerWidth) * 2 - 1;
        mouse.y = -(event.clientY / window.innerHeight) * 2 + 1;
      }
      function onClick(event) {
        event.preventDefault();
        raycaster.setFromCamera(mouse, camera);
        var intersects = raycaster.intersectObjects(scene.children);
        if (intersects.length > 0) {
          var selectedParticle = intersects[0].object;
          selectedParticle.material.color.set(Math.random() * 0xffffff);
        }
      }
      window.addEventListener('mousemove', onMouseMove, false);
      window.addEventListener('click', onClick, false);


这部分代码实现了交互事件的监听。首先创建了一个THREE.Raycaster对象和一个THREE.Vector2对象。然后定义了onMouseMove和onClick两个函数来处理鼠标移动和点击事件。onMouseMove函数用于更新鼠标位置,将其转换为Three.js坐标系中的标准化设备坐标(NDC)。onClick函数会根据鼠标点击的位置发射一条射线,并检测是否与场景中的物体相交。如果有物体相交,则将第一个相交物体的颜色设置为随机的新颜色。


最后,通过window.addEventListener方法将鼠标移动和点击事件绑定到窗口上。


```javascript
      // 动画循环
      function animate() {
        requestAnimationFrame(animate);
        particleSystem.rotation.y += 0.005;
        renderer.render(scene, camera);
      }
      animate();
    </script>
  </body>
</html>


最后,我们定义了一个动画循环函数animate。在每一帧中,我们更新粒子系统的旋转角度并使用渲染器将场景渲染到屏幕上。requestAnimationFrame方法用于递归调用animate函数,以实现流畅的动画效果。


最后,在页面加载完毕之后,我们调用animate函数启动动画循环。


整个代码实例演示了如何使用Three.js创建一个交互式的粒子系统,并通过鼠标移动和点击事件对粒子进行操作。

相关文章
|
1月前
html+js+css实现的建筑方块立体数字时钟源码
html+js+css实现的建筑方块立体数字时钟源码
79 33
|
2月前
一个好看的小时钟html+js+css源码
一个好看的小时钟html+js+css源码
116 24
|
2月前
|
Web App开发 移动开发 HTML5
html5 + Three.js 3D风雪封印在棱镜中的梅花鹿动效源码
html5 + Three.js 3D风雪封印在棱镜中的梅花鹿动效源码。画面中心是悬浮于空的梅花鹿,其四周由白色线段组成了一个6边形将中心的梅花鹿包裹其中。四周漂浮的白雪随着多边形的转动而同步旋转。建议使用支持HTML5与css3效果较好的火狐(Firefox)或谷歌(Chrome)等浏览器预览本源码。
100 2
|
3月前
JS+CSS3文章内容背景黑白切换源码
JS+CSS3文章内容背景黑白切换源码是一款基于JS+CSS3制作的简单网页文章文字内容背景颜色黑白切换效果。
34 0
|
3月前
ractive.js联系表单动画效果源码
一款ractive.js联系表单动画效果,很有创意的发送邮件、联系内容等表单,基于ractive.js实现的动画效果,以发送信件的方式。
40 1
|
3月前
|
前端开发 JavaScript
用HTML CSS JS打造企业级官网 —— 源码直接可用
必看!用HTML+CSS+JS打造企业级官网-源码直接可用,文章代码仅用于学习,禁止用于商业
222 1
|
3月前
|
JavaScript
JS趣味打字金鱼小游戏特效源码
hi fish是一款打字趣味小游戏,捞出海里的鱼,捞的越多越好。这款游戏用于电脑初学者练习打字。初学者可以根据自己的水平设置游戏难度。本段代码可以在各个网页使用,有需要的朋友可以直接下载使用,本段代码兼容目前最新的各类主流浏览器,是一款非常优秀的特效源码!
49 3
|
3月前
|
移动开发 HTML5
html5+three.js公路开车小游戏源码
html5公路开车小游戏是一款html5基于three.js制作的汽车开车小游戏源代码,在公路上开车网页小游戏源代码。
104 0
html5+three.js公路开车小游戏源码
|
3月前
|
JavaScript
JS趣味打字金鱼小游戏特效源码
hi fish是一款打字趣味小游戏,捞出海里的鱼,捞的越多越好。这款游戏用于电脑初学者练习打字。初学者可以根据自己的水平设置游戏难度。本段代码可以在各个网页使用,有需要的朋友可以直接下载使用,本段代码兼容目前最新的各类主流浏览器,是一款非常优秀的特效源码!
59 0
JS趣味打字金鱼小游戏特效源码
|
3月前
|
JavaScript
JS鼠标框选并删除HTML源码
这是一个js鼠标框选效果,可实现鼠标右击出现框选效果的功能。右击鼠标可拖拽框选元素,向下拖拽可实现删除效果,简单实用,欢迎下载
57 4

热门文章

最新文章

  • 1
    当面试官再问我JS闭包时,我能答出来的都在这里了。
    47
  • 2
    【02】仿站技术之python技术,看完学会再也不用去购买收费工具了-本次找了小影-感觉页面很好看-本次是爬取vue需要用到Puppeteer库用node.js扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-优雅草卓伊凡
    29
  • 3
    Node.js 中实现多任务下载的并发控制策略
    34
  • 4
    【2025优雅草开源计划进行中01】-针对web前端开发初学者使用-优雅草科技官网-纯静态页面html+css+JavaScript可直接下载使用-开源-首页为优雅草吴银满工程师原创-优雅草卓伊凡发布
    26
  • 5
    【JavaScript】深入理解 let、var 和 const
    49
  • 6
    【04】Java+若依+vue.js技术栈实现钱包积分管理系统项目-若依框架二次开发准备工作-以及建立初步后端目录菜单列-优雅草卓伊凡商业项目实战
    47
  • 7
    【03】Java+若依+vue.js技术栈实现钱包积分管理系统项目-若依框架搭建-服务端-后台管理-整体搭建-优雅草卓伊凡商业项目实战
    57
  • 8
    【02】Java+若依+vue.js技术栈实现钱包积分管理系统项目-商业级电玩城积分系统商业项目实战-ui设计图figmaUI设计准备-figma汉化插件-mysql数据库设计-优雅草卓伊凡商业项目实战
    57
  • 9
    如何通过pm2以cluster模式多进程部署next.js(包括docker下的部署)
    72
  • 10
    【01】Java+若依+vue.js技术栈实现钱包积分管理系统项目-商业级电玩城积分系统商业项目实战-需求改为思维导图-设计数据库-确定基础架构和设计-优雅草卓伊凡商业项目实战
    57