galacean / engine

A typescript interactive engine, support 2D, 3D, animation, physics, built on WebGL and glTF.
https://galacean.antgroup.com/
MIT License
4.04k stars 289 forks source link

ParticleCompositeCurve Curve and TwoCurves Mode not as expected #2085

Open JujieX opened 2 months ago

JujieX commented 2 months ago

Describe the bug speed is still 0 when use ParticleCurveMode as Curve.

WebGLEngine.create({
  canvas: "canvas",
  graphicDeviceOptions: { webGLMode: WebGLMode.WebGL1 },
}).then((engine) => {
  Logger.enable();
  engine.canvas.resizeByClientSize();

  const scene = engine.sceneManager.activeScene;
  const rootEntity = scene.createRootEntity();
  scene.background.solidColor = new Color(15 / 255, 38 / 255, 18 / 255, 1);

  // Create camera
  const cameraEntity = rootEntity.createChild("camera_entity");
  cameraEntity.transform.position = new Vector3(0, 1, 3);
  const camera = cameraEntity.addComponent(Camera);
  camera.fieldOfView = 60;

      const particleEntity = cameraEntity.createChild();
      particleEntity.transform.position.set(0, -7.5, -8);

      const particleRenderer = particleEntity.addComponent(ParticleRenderer);

      const material = new ParticleMaterial(engine);
      particleRenderer.setMaterial(material);

      const { main, emission, velocityOverLifetime } =
        particleRenderer.generator;

      // Main module
      main.startSpeed.constant = 0;
      // Emission module
      emission.rateOverTime.constant = 5;

      // Velocity over lifetime module
      velocityOverLifetime.enabled = true;

      // velocityOverLifetime.velocityY.mode = ParticleCurveMode.Constant;
      // velocityOverLifetime.velocityY.constant = 1;

      velocityOverLifetime.velocityY.curve = new ParticleCurve();
      velocityOverLifetime.velocityY.curve.setKeys([
        new CurveKey(0, 1),
        new CurveKey(1, 1),
      ]);
      velocityOverLifetime.velocityY.mode = ParticleCurveMode.Curve;
    });
  engine.run();

Expected behavior

      velocityOverLifetime.velocityY.mode = ParticleCurveMode.Constant;
      velocityOverLifetime.velocityY.constant = 1;
      velocityOverLifetime.velocityY.curve = new ParticleCurve();
      velocityOverLifetime.velocityY.curve.setKeys([
        new CurveKey(0, 1),
        new CurveKey(1, 1),
      ]);
      velocityOverLifetime.velocityY.mode = ParticleCurveMode.Curve;
    });

should has almost same performance