Three.JS - 粒子沿随机方向绕点运行形成球体

2024-02-20

我有一个粒子系统,其中所有粒子都位于相同的坐标处,并且在随机方向上一个接一个地,它们(应该)开始绕场景中心运行,形成一个球体。

到目前为止,我成功实现的是一组 Vector3 对象(粒子),它们一个接一个地开始沿着 Z 轴绕中心运行,只需根据当前角度计算它们的正弦和余弦。

我不太擅长数学,我什至不知道到底要寻找什么。

这是我写的:

var scene = new THREE.Scene();

let container = document.getElementById('container'), 
    loader = new THREE.TextureLoader(), 
    renderer, 
    camera, 
    maxParticles = 5000, 
    particlesDelay = 50, 
    radius = 50, 
    sphereGeometry, 
    sphere;

loader.crossOrigin = true;

function init() {

    let vw = window.innerWidth, 
        vh = window.innerHeight;

    renderer = new THREE.WebGLRenderer();
    renderer.setSize(vw, vh);
    renderer.setPixelRatio(window.devicePixelRatio);

    camera = new THREE.PerspectiveCamera(45, vw / vh, 1, 1000);
    camera.position.z = 200;
    camera.position.x = 30;
    camera.position.y = 30;
    camera.lookAt(scene.position);
    scene.add(camera);

    let controls = new THREE.OrbitControls(camera, renderer.domElement);

    let axisHelper = new THREE.AxisHelper(50);
    scene.add(axisHelper);

    container.appendChild(renderer.domElement);

    window.addEventListener('resize', onResize, false);

}

function onResize() {

    camera.aspect = window.innerWidth / window.innerHeight;
    camera.updateProjectionMatrix();

    renderer.setSize(window.innerWidth, window.innerHeight);    

}

function draw() {

    sphereGeometry = new THREE.Geometry();
    sphereGeometry.dynamic = true;

    let particleTexture = loader.load('https://threejs.org/examples/textures/particle2.png'), 
        material = new THREE.PointsMaterial({
            color: 0xffffff, 
            size: 3, 
            transparent: true, 
            blending: THREE.AdditiveBlending, 
            map: particleTexture, 
            depthWrite: false
        });

        for ( let i = 0; i < maxParticles; i++ ) {

            let vertex = new THREE.Vector3(radius, 0, 0);
            vertex.delay = Date.now() + (particlesDelay * i);
            vertex.angle = 0;
            sphereGeometry.vertices.push(vertex);

        }

        sphere = new THREE.Points(sphereGeometry, material);
        scene.add(sphere);

}

function update() {

    for ( let i = 0; i < maxParticles; i++ ) {

        let particle = sphereGeometry.vertices[i];

        if ( Date.now() > particle.delay ) {

            let angle = particle.angle += 0.01;

            particle.x = radius * Math.cos(angle);

            if ( i % 2 === 0 ) {
                particle.y = radius * Math.sin(angle);
            } else {
                particle.y = -radius * Math.sin(angle);
            }

        }


    }

    sphere.geometry.verticesNeedUpdate = true;

}

function render() {

    update();
    renderer.render(scene, camera);
    requestAnimationFrame(render);

}

init();
draw();
render();

如果您想实时观看,这里是 JSFiddle:https://jsfiddle.net/kekkorider/qs6s0wv2/ https://jsfiddle.net/kekkorider/qs6s0wv2/

EDIT: 工作示例 https://jsfiddle.net/kekkorider/qs6s0wv2/4/

有人可以帮我一下吗?

提前致谢!


您希望每个粒子围绕特定的随机轴旋转。您可以让他们遵循圆的参数方程 https://math.stackexchange.com/questions/73237/parametric-equation-of-a-circle-in-3d-space在 3D 空间中,或者您可以使用 THREE.js 旋转矩阵。

现在所有粒子都围绕矢量 (0, 0, 1) 旋转。由于粒子从 x 轴开始,因此您希望它们全部围绕 y-z 平面 (0, y, z) 中的随机向量旋转。这可以在创建顶点期间定义:

vertex.rotationAxis = new THREE.Vector3(0, Math.random() * 2 - 1, Math.random() * 2 - 1);
vertex.rotationAxis.normalize();

现在你可以打电话THREE.Vector3.applyAxisAngle(axis, angle)使用每次更新创建的随机旋转轴对每个粒子进行方法:

particle.applyAxisAngle(particle.rotationAxis, 0.01); 

总而言之,它应该是这样的:

draw():

...
for ( let i = 0; i < maxParticles; i++ ) {

    let vertex = new THREE.Vector3(radius, 0, 0);
    vertex.delay = Date.now() + (particlesDelay * i);
    vertex.rotationAxis = new THREE.Vector3(0, Math.random() * 2 - 1, Math.random() * 2 - 1);
    vertex.rotationAxis.normalize();
    sphereGeometry.vertices.push(vertex);
}
...

update():

...
for ( let i = 0; i < maxParticles; i++ ) {

    let particle = sphereGeometry.vertices[i];

    if ( Date.now() > particle.delay ) {
        particle.applyAxisAngle(particle.rotationAxis, 0.01); 
    }
}
...
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Three.JS - 粒子沿随机方向绕点运行形成球体 的相关文章

  • 如何从 cdn THREE.js 加载 GLTFLoader

    我在弄清楚如何让 GLTFLoader 在 THREE js 中工作时遇到一些问题 我不明白如何使用 CDN 站点来托管文件 我尝试过使用网络上示例的链接 但这并没有完成我的工作 我在另一篇文章中读到 GLTFLoader 文件必须与我正在
  • Three.js 通过 Gui 阻止 Raycast

    我想通过光线投射选择对象 但每次我想在 Three js GUI 上选择某些内容时 Mousdown 事件都会被触发 我怎么说 如果 Gui 在对象前面 则不触发 之类的话 document addEventListener mousedo
  • 有什么方法可以从 Three.js Object3D 中获取边界框吗?

    我正在使用 Three js 和 OBJLoader js 加载 OBJ 文件 这将返回一个 Three Object3D 对象 它具有您期望从 3D 模型中获得的内容 位置向量 向上向量 我不明白的是如何获得它的边界框 这可能吗 您不需要
  • 该浏览器无法识别 React Three Fiber 网格标签

    我正在关注 Youtube 上的 3d 作品集教程 但遇到了这个错误 在这里 我尝试渲染网格 但控制台显示警告 此元素在此浏览器中无法识别 浏览器正在渲染其余部分 但这部分代码没有被渲染 这是代码块 const Computers gt c
  • Three.js 在平面上旋转相机

    我的应用程序中有一个相机 camera new THREE PerspectiveCamera 75 window innerWidth window innerHeight 0 1 1000 camera position z 1 cam
  • 为什么音频可视化直播无法在移动设备/Safari 上运行?

    我正在尝试基于 Three js 示例制作音频直播可视化工具 https trijs org examples q visua webaudio visualizer https threejs org examples q visua w
  • 在 ThreeJS 中将 2D 鼠标坐标转换为世界 XZ 坐标

    我需要将鼠标屏幕坐标转换为 XZ 平面上的 ThreeJS 世界坐标 我发现这个工作代码可以将鼠标位置转换为 XY 世界坐标 但我不知道如何修改它以获取 XZ 坐标 var vector new THREE Vector3 vector s
  • Three.js - 如何更新 arrowHelper?

    我正在尝试更新 arrowHelper 我尝试过操作箭头对象线中的顶点 设置所有内容dynamic true等等 但我似乎能做到的唯一方法就是删除旧线并绘制新线 有没有办法更新 arrowHelper 因此 您无法通过更改用于创建对象的值来
  • Three.js 支持波斯语/阿拉伯语文本

    我需要以波斯语 阿拉伯语显示一些文本 我加载了包含字符的字体 并使用 TextGeometry 在场景上创建文本 var loader new THREE FontLoader loader load B Zar Regular js fu
  • 如何在 Three.js 中使用反射?

    我想在带有 Three js 的 WebGL 页面中拥有一个反射立方体表面 它应该类似于手机显示屏 反射一些光 但它仍然必须是黑色的 我创建了一个反射立方体 以及反射球体 的示例 并附有详细的注释 现场版本位于 http stemkoski
  • Material.alphaTest 是什么意思?

    在过去的几天里 我一直在非相交对象的透明度方面遇到重大问题 我遇到了设置的建议alphaTest将材料的值调整为0 5 从而解决了问题 太好了 但我想更好地理解它的含义以及它如何如此优雅地解决问题 有人可以建议吗 从一个简单的实验来看 这似
  • 给定 3D 空间中的一条线,如何找到从它到一点的角度?

    我在 3D 空间中有两组点 我想画一条穿过两组点的中心的线 然后找到从该线到每个点的角度 从那里开始 我将根据两个角度的接近程度来确定两组中的匹配点 我知道如何找到每组点的中心 只需将它们平均在一起 并且我知道如何将它们匹配 甚至考虑到它们
  • Threejs + Vanilla JS 和 React-Three-Fiber + Create-React-App 之间的颜色差异

    这已经困扰我一段时间了 为什么 React Three Fiber 中的材质颜色看起来比 Threejs 中暗淡 两种实现中的对象及其属性是相同的 Threejs 版本相同 在新引导中实施 create react app 没有额外的依赖项
  • 星系模拟:更改点的颜色并在鼠标悬停时显示文本

    我正在尝试创建模拟 https riteshsingh github io galaxies 4673 个最近星系的位置 星系是点 我想为鼠标悬停时的点着色并加载星系的名称 我花了很多天试图实现它 我可以更改颜色以及进行基本的光线投射 但是
  • 调试 Three.js 中的低 FPS

    我正在处理 Three js WebGL 场景 当我缩小时 我注意到 60 FPS 以便所有观察结果 约 20 000 个三角形 都在视图中 但当我放大时 FPS 非常低 因此只有一个小三角形的子集在视野中 我想弄清楚是什么导致了这种差异
  • ThreeJS bufferGeometry 位置属性在应用翻译时不会更新

    我使用 STLLoader 将 stl 加载到返回 BufferGeometry 的 ThreeJS 场景中 然后我用了 myMesh position set x y z myMesh rotation setFromQuaternion
  • 在 TypeScript 中使用三个 Js + OrbitControl

    我无法得到this http www example com 在 TypeScript 中使用上述组合的示例 I have and 在我的html中和打字稿文件
  • THREE.JS,忽略父级的轮换

    我试图使子对象跟随父级位置并表现得像一个普通的子对象 但是我希望它保持其旋转不变 在不影响性能的情况下 最好的方法是什么 我的CPU预算很紧张 已经运行了2个工作线程并且有很多对象 是否有设置只允许孩子的位置受到影响 同样重要的是 当父级旋
  • Three.js 椭圆

    如何在 Three js 中创建一个椭圆 我看过这个 在 THREE js 中绘制椭圆 https stackoverflow com questions 11419896 drawing an ellipse in three js 但如
  • 如何在 Three.js 场景中包含 OVRManager?

    我创建了几个 Three js Javascript 演示应用程序 正在我的新 Oculus Go 中进行试验 我正在尝试让 Go 控制器在我的应用程序中执行某些操作 根据 Oculus 开发人员中心的说法 最好的办法是将 OVRManag

随机推荐

  • 只有 NSMutableArray 的第一个对象存储在 NSUserDefaults 中

    我正在尝试存储 UILocalNotification 队列来解决极限问题 https stackoverflow com questions 14689661 cordova ios limit for local notificatio
  • Ruby/Rails 中的“Ago”日期/时间函数

    我想知道 Rails 中是否有一种方法可以计算时间戳 例如半分钟前 2 分钟前 1 天前等 类似于 twitter 实时日期戳的东西 我想知道 Ruby Rails 是否有用于此类日期时间转换的内置函数 您可以使用 10 minutes a
  • bitbake中SRC_URI和FILESEXTRAPATHS_prepend的区别

    为什么我们需要给出文件路径SRC URI即使我们将文件路径包含在FILESEXTRAPATHS prepend多变的 例如 SUMMARY Simple Hello application LICENSE MIT LIC FILES CHK
  • hashmap键集自动排序

    HashMap
  • 为什么 -compile(export_all) 是不好的做法?

    所有的erlang书籍似乎都说export all是不好的做法 但没有给出理由 最后 大多数模块将大部分时间都花在了compile export all 上 因为不断更新模块列表以删除辅助函数是很麻烦的 这是不好的做法吗 因为我应该关心我向
  • 如何既保存两台相机的数据又不影响其拍照速度?

    我正在使用多光谱相机来收集数据 一种是近红外光 另一种是彩色光 不是两台相机 而是一台相机可以同时获取两种不同类型的图像 我可以使用一些 API 函数 例如 J Image OpenStream 两部分核心代码如下所示 一个用于打开两个流
  • PostgresQL SQL:将结果转换为数组

    查询如下 SELECT i adgroup id i category id FROM adgroupcategories br WHERE i adgroup id IN SELECT i adgroup id FROM adgroupu
  • 将数据帧写入 postgres 数据库

    我想将 pandas 数据帧写入 postgres 表 我按如下方式连接到数据库 import psycopg2 import pandas as pd import sqlalchemy def connect user password
  • React 模块解析失败:意外的标记 (1:48)

    有人能帮我吗 我只是创建反应应用程序 然后立即启动它 然后我收到了类似这样的错误 我对 webpack 不太了解 CMD src index js 1 48 Module parse failed Unexpected token 1 48
  • 重置 Keras 层中的权重

    我想重置 随机化 Keras 深度学习 模型中所有层的权重 原因是我希望能够使用不同的数据分割多次训练模型 而不必每次都进行 缓慢的 模型重新编译 灵感来自这次讨论 https github com fchollet keras pull
  • UNIX 中“./”和“sh”的区别

    有时我发现很少有脚本是通过 sh 命令执行的 有时是通过 命令执行的 我无法理解它们之间的确切区别 请帮助我 sh file在新的 shell 进程中执行 shell 脚本文件 file在当前 shell 进程中执行 shell 脚本文件
  • 命令行终端上的乘法

    我正在使用串行终端为我们的实验室实验提供输入 我发现使用 echo 5X5 只返回一个字符串 5X5 有没有执行乘法运算的命令 是的 您可以使用bash 的内置算术扩展 https www gnu org software bash man
  • 如何解决“不支持关键字:‘元数据’”?

    我无法连接到 SQL Server 我的项目的连接字符串是
  • 使用图权重提升深度优先访问者最小生成树

    我想从具有边权重的顶点创建最小生成树 并以深度优先顺序遍历图 我可以构建图表和最小生成树 但我无法编写自定义访问者 include
  • WinHttpSendRequest 失败并显示 ERROR_WINHTTP_SECURE_FAILURE

    以编程方式与网络进行通信不是我的专业领域 但我设法通过从网上找到的示例中剪切和粘贴代码来创建 read web page 函数 并且该代码已经连续好几个月每天正常运行 碰巧的是 我工作时的主 Windows 10 电脑坏了 在等待维修时 我
  • PHP - 读取和修复大型无效 XML 文件

    我必须读取一些相当重的 XML 文件 200 MB 到 1 GB 之间 其中一些文件是无效的 让我举一个小例子
  • 为什么最终没有被调用?

    我有几个关于java中的垃圾收集器的问题 Q1 据我了解 当对象超出范围并且 JVM 即将收集垃圾时 finalize 就会被调用 我认为 Finalize 方法是由垃圾收集器自动调用的 但在这种情况下它似乎不起作用 解释是什么 为什么需要
  • ObjC Plist 文件读取比 JSON 快?

    我做过这个测试项目https github com danielpetroianu FileDeserializeBenchmarking https github com danielpetroianu FileDeserializeBe
  • jQuery 错误? .appendTo() 在 IE7 中不起作用

    我正在尝试为 jQuery 创建一个选项传输插件 我可以在 Opera Firefox Chrome 和 Safari 中使用基本功能 但 IE7 无法配合 IE7 中的传递函数的运行似乎非常零散且难以理解 我创造了一个示例页面来说明我的问
  • Three.JS - 粒子沿随机方向绕点运行形成球体

    我有一个粒子系统 其中所有粒子都位于相同的坐标处 并且在随机方向上一个接一个地 它们 应该 开始绕场景中心运行 形成一个球体 到目前为止 我成功实现的是一组 Vector3 对象 粒子 它们一个接一个地开始沿着 Z 轴绕中心运行 只需根据当