# Interpolatoren in Folge produzieren falsche Ausgaben



## Rietz (11. Mai 2005)

hi,

ich habe versucht mehre interpolatoren hinter einander zu setzen. im detail:

erst ein rotationsinterpolator, dann pathinterpolator, dann ein rotationsinterpolator, dann ein pathinterpolator ... .

nun scheint es aber bei der darstellung probleme zu geben. ich habe den eindruck als optimiert er die interpolatoren und führt alle bei der darstellung im applet gleichzeitig aus.

wo liegt der fehler?

vielen dank.


----------



## Illuvatar (11. Mai 2005)

Was meisnt du mit hintereinander?


----------



## rietz (11. Mai 2005)

hallo Illuvatar,

vielen dank für dein interesse.

im detail, ich habe drei punkte. ich bewege (kamera) von punkt 1 zu punkt 2 und verwende hier den positionpathinterpolator. an punkt 2 angekommen soll die kamera sich in richtung punkt 3 drehen, dafür nehme ich den rotationsinterpolator. nachdem gedreht nehme ich wieder den positionpathinterpolator um zu p3 zu gelangen.

im normalfall würde man den RotPosPathInzerpolator nehmen, nur dieser würde sich in der bewegung von punkt 2 zu punkt 3 während der bewegung drehen und nicht direkt an punkt 2.

wenn ich meinen animation dann ausführe scheint er alle interpolatoren gleichzeitig auszuführen, da nur die bewegung von p1 zu p2 erfolgt und die animation endet.

weisst du eine lösung?


----------



## Illuvatar (11. Mai 2005)

Solang ich net weiß wie du es machst kann ich dir net helfen^^ du musst halt erst nen PathInterpolator machen, wenn der fertig is nen RotationInterpolator, wenn der fertig is nen PathInterpolator usw


----------



## rietz (12. Mai 2005)

ich verwende eine for schleife.

als abfragebedingung wird ein point3f array verwendet.
{ermittlung winkel um den sich gedreht werden muss.
setzen rotationsinterpolator
setzen positionpathinterpolator
}

bei der darstellung scheint er aber den inhalt der schleife zu optimieren.

ist dir dies schon mal passiert?

danke


----------



## bazz-dee (12. Mai 2005)

Wenn ich das richtig verstehe machst du immer abwechselnd Rotation und Position ja??

Willst du das Objekt um sich selbst drehen oder um ein andere Objekt?
Weil die Rotation ja normal nur um den Urspung läuft.


----------



## rietz (12. Mai 2005)

hallo bazz-dee,

das stimmt, in der schleife erfolgt jeweils eine roation und dann bewegung. die rotation dreht sich um die eigene achse.

kannst du mir helfen?


----------



## bazz-dee (12. Mai 2005)

Dann probier mal das Objekt vor der Rotation jeweils in den Ursprung zu verschieben, um sich selber zu drehen, und dann wieder zurück zu schieben.

Ansonsten zeig mal nen bischen Quelltext.


Oder ne Idee:

```
...
TransformGroup tgObjekt = new TransformGroup();
TransformGroup tgRotationObjekt = new TransformGroup();
TransformGroup tgPositionObjekt = new TransformGroup();

tgObjekt.add(new Spehere(radius, myAppearance));

tgRotationObjekt.add(tgObjekt);

tgPositionObjekt.add(tgRotationObjekt);
...
```

Und jetz tust du die Rotationsinterpolation immer auf das tgRotationObjekt anwenden und die Positionsinterpolation immer auf das tgPositionObjekt.
Ich bin mir jetzt zwar nicht 100%ig sicher, aber ich glaube so müsste das funktionieren.


----------



## rietz (17. Mai 2005)

hallo bazz-dee,

danke. ich versuchs mal.


----------



## rietz (19. Mai 2005)

halllo bazz-dee, 

also am Bsp.

Als erstes möchte ich den Körper drehen und anschließend verschieben.

Die Drehung dauert 5s und anschl. soll der Körper 7s verschoben werden.

Das Problem. wärend er dreht führt er schon die Verschiebung aus. Wenn Die Rotation aufhört, wird der Körper noch 2s verschoben.

Woran habert es?

Wäre sehr nett wenn du mir dabei helfen könntest.


```
import java.applet.Applet;
import java.awt.BorderLayout;
import java.awt.GraphicsConfiguration;
import com.sun.j3d.utils.applet.MainFrame;
import com.sun.j3d.utils.geometry.*;
import com.sun.j3d.utils.image.*;
import com.sun.j3d.utils.universe.*;
import javax.media.j3d.*;
import javax.vecmath.*;

public class Universe extends Applet
   {
   private SimpleUniverse u = null;

   public Universe()
      {
      }

   public BranchGroup createSceneGraph()
      {
      BranchGroup          RootBG=new BranchGroup();
      DirectionalLight     DLgt=new DirectionalLight(new Color3f(0.8f,0.8f,1.0f),new Vector3f(-0.5f,-1f,-0.5f));
      AmbientLight         ALgt=new AmbientLight(new Color3f(0.8f,0.8f,0.8f));
      BoundingSphere       BigBounds=new BoundingSphere(new Point3d(),100000);
      ALgt.setInfluencingBounds(BigBounds);
      DLgt.setInfluencingBounds(BigBounds);
      RootBG.addChild(ALgt);
      RootBG.addChild(DLgt);
  
      Appearance           BoxAppearance=new Appearance();
      TransformGroup       BoxTG=new TransformGroup(),RotTG=new TransformGroup();

      BoxTG.addChild(RotTG);
      RotTG.addChild(new com.sun.j3d.utils.geometry.Box(0.1f,0.2f,0.3f,Sphere.GENERATE_NORMALS,BoxAppearance));
      RotTG.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);

      Alpha alpha = new Alpha(1, 5000);
      RotationInterpolator rotationInterpolator = new RotationInterpolator(
                     alpha, RotTG);
      rotationInterpolator.setMinimumAngle(0);
      rotationInterpolator.setMaximumAngle((float) Math
                     .toRadians(360 * 5));
      rotationInterpolator.setSchedulingBounds(new BoundingSphere(
                     new Point3d(), 100000));
      RootBG.addChild(rotationInterpolator);  
  

       Alpha alpha2 = new Alpha(1, 7000);
       PositionInterpolator positionInterpolator = new PositionInterpolator(alpha2, RotTG);
       positionInterpolator.setStartPosition(0f);
       positionInterpolator.setEndPosition(1f);
       positionInterpolator.setSchedulingBounds(new BoundingSphere(
                       new Point3d(), 100000));
      RootBG.addChild(positionInterpolator);
      RootBG.addChild(BoxTG);

      RootBG.compile();
      return RootBG;
      }

   public void init()
      {
      setLayout(new BorderLayout());
      GraphicsConfiguration config=SimpleUniverse.getPreferredConfiguration();
      Canvas3D c = new Canvas3D(config);
      add("Center", c);
      u = new SimpleUniverse(c);

      u.getViewingPlatform().setNominalViewingTransform();
      u.addBranchGraph(createSceneGraph());
      }


   public static void main(String[] args)
      {
      new MainFrame(new Universe(), 400, 400);
      }
}
```


----------



## rietz (20. Mai 2005)

für alle die es interessiert:

das problem bestand in der kurzen def. der alpha und kann mit der ausführlichen schreibweise korrigiert werden.

recht herzlichen dank an bazz-dee!  :lol:


----------

