Willkommen auf unserem Seminar-Blog

Immer auf dem aktuellen Stand bleiben

Dieser Seminar-Blog befindet sich noch im Aufbau und wird in den kommenden Tagen entsprechend verfeinert.

Member Login

Lost your password?

Registration is closed

Sorry, you are not allowed to register by yourself on this site!

You must either be invited by one of our team member or request an invitation by email at viad.info {at} zhdk {dot} ch.

6. PVector – Mit Vektoren rechnen

10. November 2010

Bei dieser Vorlage mussten wir das Setzen der Linie mit zwei Mausklicks einführen und der Ball sollte nicht nur in eine Richtung laufen, sondern vor und zurück. Zusätzlich sollte die Animation noch unabhängig von der Framerate ablaufen, die Zeitdauer für die Bewegung des Balls entlang der Linie also immer gleich sein. Hier habe ich die Animation abhängig von der Abspieldauer des Programms in Millisekunden gemacht. Um den Ball wieder zurücklaufen zu lassen habe ich die Position nicht vom Anfangspunkt her errechnet sondern vom Endpunkt her. Die Variabel curTimeSwitch wird als Toggle benutzt, welche beim Vollenden der Strecke jeweils mit -1 multipliziert wird.
pos = PVector.sub( endPos , PVector.mult(dir,normTime));
Damit die Animation erst nach zwei Klicks startet, also wenn beim ersten der Anfangspunkt und beim zweiten Klick der Endpunkt gesetzt wurde, habe ich zwei Flags (Booleans) dafür benutzt. Die Animation startet erst, wenn beide Flags auf true stehen.
PVector     startPos = new PVector();
PVector     endPos = new PVector();
PVector     dir = new PVector();
PVector     pos = new PVector();
int         curTime = 0;
int         animTime = 2000;  // new milliseconds
int         curTimeSwitch = 1; // allow reversed animation
boolean     startPosSet=false;
boolean     endPosSet=false;
int         startMs = 0; // milliseconds since animation started

void setup()
{
  size(640, 480);
  smooth();
  frameRate(48); // animation
}

void draw()
{
  background(51);

  // milliseconds since programm start
  int curMs = millis(); // current milliseconds

  // toggle animation, if animation time elapsed -> reverse animation
  if (curTime > animTime) {
     curTimeSwitch*= -1; // reverse animation
     startMs = curMs;
  }

  // calc. the animation time
  curTime = (curMs - startMs); // time that has passed

  // procentual progress
  float normTime = curTime * 1.0 / animTime;

  if(startPosSet==true && endPosSet==true)
  {
    stroke(255);
    line(startPos.x,startPos.y,
         endPos.x,endPos.y);

    PVector dir = PVector.sub(endPos,startPos);
    //animDistance = dir.mag(); // distance line between start and end point

    if (curTimeSwitch>0) {
      pos = PVector.add( startPos , PVector.mult(dir,normTime));
    } else {
      pos = PVector.sub( endPos , PVector.mult(dir,normTime));
    }
    ellipse(pos.x,pos.y, 20,20);
  }

}

// function mouse has been pressed
void mousePressed()
{
  curTime = 0;
  if (startPosSet==false || (startPosSet==true && endPosSet==true)) {
    // set start position
    startPos.set(mouseX,mouseY,0);
    endPos = startPos.get();
    startPosSet=true;
    endPosSet=false;
  } else if (endPosSet==false) {
    // set end position
    endPos.set(mouseX,mouseY,0);
    endPosSet=true;
    startMs = millis();
  }
}