Javascript 如何使用Three.js定义相对于向量路径的粒子云?

Javascript 如何使用Three.js定义相对于向量路径的粒子云?,javascript,vector,graphics,three.js,particle-system,Javascript,Vector,Graphics,Three.js,Particle System,我一直在研究和玩Three.js中的粒子云示例。大多数使用形状几何体定义粒子场,或在整个视野中随机分布粒子的参数。我想做的是创建一个粒子云,其中每个粒子都相对接近一个不可见的向量路径。例如,如果我定义了一个略微弯曲的向量路径,所有粒子可能会在一个一致的半径内沿着该不可见的路径浮动,然后可能会向端点逐渐变细,形成一个热狗形状的粒子云。所以,我知道如何创建粒子,我知道如何创建向量路径,我如何将这两个东西连接在一起?谢谢 可以使用两点定义路径。设这些点为p和q,并设v=p-q。路径上的任何点M必须满足

我一直在研究和玩Three.js中的粒子云示例。大多数使用形状几何体定义粒子场,或在整个视野中随机分布粒子的参数。我想做的是创建一个粒子云,其中每个粒子都相对接近一个不可见的向量路径。例如,如果我定义了一个略微弯曲的向量路径,所有粒子可能会在一个一致的半径内沿着该不可见的路径浮动,然后可能会向端点逐渐变细,形成一个热狗形状的粒子云。所以,我知道如何创建粒子,我知道如何创建向量路径,我如何将这两个东西连接在一起?谢谢

可以使用两点定义路径。设这些点为
p
q
,并设
v=p-q
。路径上的任何点
M
必须满足向量方程

M = (1 - lambda) * p + lambda * q

对于一些
0,非常感谢!我一直在我的档案里乱搞它,不能让它正常工作。粒子在z轴上呈扇形向外扩散,但在x轴和y轴上似乎没有辐射。我做了一把小提琴,用透视图向下看,这样你就能明白我的意思。思想?我打了一个小错误-
e1
应该是
(v.y,-v.x,0)
而不是
(v.y,0,-v.x)
。这里有一个可行的方法:注意,我更改了
getVectorOffset
以返回
e1
e2
,这样您就可以更容易地识别椭球图案,切换回offset以满足您的需要。我只是在我的文件中对您的编辑进行了编码,并发现当我打开云时(我安装了OrbitControls)看着它,它原来是一个长方形而不是一个管状体。但是,随后我将
offset.multilyscalar(radius)
更改为
offset.setLength(radiusRange*Math.random())
,得到了四分之一的管状体。看这里:(没有轨道控制很难看到。)我仍然在用它来获得最后的四分之三发现问题是缺少负的
lambda
s和
mu
s。请参阅编辑和小提琴谢谢您的坚持,请原谅我延迟回复-我对更改进行了编码,云仍然是直线的,而不是管状的。我自己还在研究这个问题。欢迎有任何进一步的想法!
// p and q are instances of THREE.Vector3
function pointOnPath(p, q) {
   var lambda = Math.random();
   var scaledp = (new THREE.Vector3()).copy(p).multiplyScalar(1 - lambda);
   var scaleq = (new THREE.Vector3()).copy(q).multiplyScalar(lambda);
   var result = (new THREE.Vector3()).addVectors(scaledp, scaledq);
   return result;
} 
function getVectorOffset(p, q, radius) {
    var v = (new THREE.Vector3()).subVectors(q, p);
    v.normalize();
    var e1 = new THREE.Vector3(v.y, -v.x, 0),
        e2 = new THREE.Vector3(v.z, 0, -v.x);
    e1.normalize();
    e2.normalize();

    var lambda = Math.random() - 0.5,
        mu = Math.random() - 0.5;
    var offset = e1.multiplyScalar(lambda).add(e2.multiplyScalar(mu));
    offset.normalize();
    offset.multiplyScalar(radius) // multiply the compute offset by the radius you'd like it to circle around

    return offset;

}
function pointOnHotDog(p, q, radius) {
    return pointOnPath(p, q).add(getVectorOffset(p, q, radius));
}