threejs 使用透视投影相机查看粒子并没有达到远小近大效果的原因

threejs yekong

在学习threejs粒子的时候,发现自己实现的效果和视频中达到的效果差别非常大,经过查询原因如下

在使用Three.js查看粒子时,如果未能实现远小近大的效果,可能有以下几个原因:

  1. 相机设置不正确:请确保在创建透视投影相机(PerspectiveCamera)时,设置了适当的视角(fov)值。较小的视角值会导致物体更远处的粒子显示得更大,而较大的视角值会导致粒子显示得更小。您可以尝试调整视角的值,以使效果更符合预期。

  2. 粒子的尺寸设置不正确:检查粒子的尺寸设置是否正确。在使用点粒子(Points)或精灵粒子(Sprite)时,确保通过设置粒子的大小属性来控制其尺寸,以便在远处看起来较小,在近处看起来较大。

  3. 距离衰减(Distance Attenuation):如果使用了距离衰减效果,可能会影响粒子的大小。距离衰减是根据粒子到相机的距离来调整其大小的功能。您可以尝试调整距离衰减的参数,或者禁用距离衰减以查看是否影响了远小近大的效果。

  4. 粒子的位置和比例:确保粒子在场景中的位置和比例设置正确。如果粒子的位置偏离了相机或场景的中心,可能会导致视觉效果不符合预期。

请检查上述原因,并根据需要进行调整和修正,以达到期望的远小近大效果。

通过排查后发现是因为将相机衰减设置为了false造成的。

// 相机衰减
pointMaterial.sizeAttenuation = false

关闭相机衰减后

关闭相机衰减后

开启相机衰减后

开启相机衰减后

sizeAttenuation介绍

在Three.js中,sizeAttenuation是一种用于粒子渲染的属性,用于控制粒子的大小是否受距离衰减的影响。当设置为true时,粒子的大小会根据其距离相机的远近而发生衰减;当设置为false时,粒子的大小将保持不变,不受距离的影响。

sizeAttenuationtrue时,离相机更远的粒子会显得较小,而离相机较近的粒子会显得较大,这可以帮助实现透视效果和远小近大的视觉效果。这对于创建粒子系统、点云或其他需要根据距离改变大小的效果非常有用。

如果您希望粒子的大小不受距离衰减的影响,可以将sizeAttenuation属性设置为false,这样粒子的大小将保持不变,无论其距离相机的远近。

在使用Three.js创建粒子系统时,您可以通过设置PointsMaterialsizeAttenuation属性来控制粒子的大小衰减行为。例如:

const material = new THREE.PointsMaterial({
  size: 10,
  sizeAttenuation: true, // 或者 false,根据需求设置
  // 其他材质属性...
});

通过调整sizeAttenuation的值,您可以控制粒子在场景中的大小衰减行为,从而达到不同的视觉效果。

喜欢