Пример #1
0
  public void pre_step() {
    Vector3f ab = mathematik.Util.sub(mParticleA.position(), mParticleB.position());
    Vector3f cb = mathematik.Util.sub(mParticleC.position(), mParticleB.position());
    final float mCurrentAngle = ab.angle(cb);

    if (mCurrentAngle < mMinAngle) {
      final int TINY_FACTOR_MODELL = 0;
      final int TRIG_MODELL = 1;
      final int MAX_DISTANCE_MODELL = 2;

      final int mModell = TRIG_MODELL;

      switch (mModell) {
        case TINY_FACTOR_MODELL:
          {
            final float TINY_FACTOR = 1.1f;
            final float mDistance =
                mParticleA.position().distance(mParticleC.position()) * TINY_FACTOR;
            restlength(mDistance);
          }
          break;
        case TRIG_MODELL:
          {
            // a = sqrt ( b*b + c*c - 2bc*cosA )
            final float b = ab.length();
            final float c = cb.length();
            final float mDistance =
                (float) Math.sqrt(b * b + c * c - 2 * b * c * (float) Math.cos(mMinAngle));
            restlength(mDistance);
          }
          break;
        case MAX_DISTANCE_MODELL:
          {
            final float mDistance =
                mParticleA.position().distance(mParticleB.position())
                    + mParticleC.position().distance(mParticleB.position());
            restlength(mDistance);
          }
          break;
      }
      active(true);
    }
  }
    public void loop() {
      for (int i = 0; i < particles.length; i++) {
        /* check if particle is active.
         * if so, animate the particle, if not, reset the particle
         * to a random start position */
        if (particles[i].isActive) {
          Vector3f myDirection = new Vector3f(event().mouseX, event().mouseY, 0);
          myDirection.sub(particles[i].position);
          final float myDistance = myDirection.length();
          myDirection.scale(particles[i].speed / myDistance);
          particles[i].position.add(myDirection);

          particles[i].color.a = 1 - myDistance / (-1.5f * SPAWN_DEPTH);

          if (myDistance < 1) {
            particles[i].isActive = false;
          }
        } else {
          particles[i].isActive = true;
          particles[i].position.set(
              _myRandom.getFloat(-640, 640), _myRandom.getFloat(-480, 480), SPAWN_DEPTH);
          particles[i].color.a = 0;
        }

        /* map position to backup array */
        positionbackuparray[i * 3 + 0] = particles[i].position.x;
        positionbackuparray[i * 3 + 1] = particles[i].position.y;
        positionbackuparray[i * 3 + 2] = particles[i].position.z;

        /* map color4f to backup array */
        colorbackuparray[i * 4 + 0] = particles[i].color.r;
        colorbackuparray[i * 4 + 1] = particles[i].color.g;
        colorbackuparray[i * 4 + 2] = particles[i].color.b;
        colorbackuparray[i * 4 + 3] = particles[i].color.a;
      }
    }