【发布时间】:2021-05-14 02:17:10
【问题描述】:
我的THREE.Points 对象有以下设置:
this.particleGeometry = new THREE.BufferGeometry()
this.particleMaterial = new THREE.ShaderMaterial(
{
vertexShader: vshader,
fragmentShader: fshader,
blending: THREE.AdditiveBlending,
depthWrite: false,
uniforms: {
uTime: new THREE.Uniform(0),
uMousePosition: this.mousePosition
}
}
)
然后是一些代码将点放在球体上的BufferGeometry 中。这工作正常。
我还设置了一个 Raycaster 来跟踪与隐藏平面相交的鼠标位置,然后相应地更新制服 uMousePosition。这也很好用,我将鼠标位置发送到我的顶点着色器。
现在我正在尝试使与鼠标保持一定距离d 的粒子远离它,当然最接近的粒子会被推开,并且还将重力应用到它们的原始位置以恢复一切过了一段时间。
这就是我的顶点着色器中的内容:
void main() {
float lerp(float a, float b, float amount) {
return a + (b - a) * amount;
}
void main() {
vec3 p = position;
float dist = min(distance(p, mousePosition), 1.);
float lerpFactor = .2;
p.x = lerp(p.x, position.x * dist, lerpFactor);
p.y = lerp(p.y, position.y * dist, lerpFactor);
p.z = lerp(p.z, position.z * dist, lerpFactor);//Mouse is always in z=0
vec4 mvPosition = modelViewMatrix * vec4(p, 1.);
gl_PointSize = 30. * (1. / -mvPosition.z );
gl_Position = projectionMatrix * mvPosition;
}
}
这是当鼠标在球体之外时的样子(添加了一个随着鼠标位置移动的小球体以指示鼠标位置)
当鼠标在里面时:
外部看起来已经有点正确了,但鼠标内部只会将粒子移回其原始位置,而应该将它们推到更远的位置。我想我必须以某种方式确定距离的方向。
另外,lerp 方法不 lerp,粒子直接跳转到它们的位置。
所以我想知道如何获得与鼠标的正确距离以始终在某个区域内移动粒子,以及如何为 lerp / 重力效果设置动画。
【问题讨论】:
-
是的,您需要考虑方向。这是
position和mousePosition减法的归一化向量。 -
不得不删除我的评论 - 我试图理解但并不真正明白。标准化有什么帮助?我明白你为什么要从 mousePosition 中减去位置。然后我会得到大于或小于 0 的 x,y,z。然后我必须以某种方式将更大或更小的映射到 -1 或 1。如果没有 if 语句,我怎么能做到这一点?但是规范化并没有改变方向,所以我不明白为什么要规范化?谢谢!