# Richtungsabhängiges Skalieren mit Interpolator



## Ariovist (31. Mai 2009)

Hallo zusammen,

ich habe gelesen, dass es möglich sein soll, in Animationen richtungsabhängig zu skalieren, also in x,z Richtung den Wert nicht zu verändern, aber in y-Richtung. Leider habe ich nicht gefunden, wie man das macht.

Mein Problem ist, dass bei der Verwendung von 

```
ScaleInterpolator stretch = new ScaleInterpolator(alpha,myTransGroup,stretch3D,1.0f,2f);
```
prinzipiell in jede Richtung die Größe verändert wird, auch wenn ich stretch3D mit einer anisotropen Matrix initialisiere.

Mit 
	
	
	
	





```
System.out.println(stretch3D.toString());
```
 bekomme ich:

1.0, 0.0, 0.0, 0.0
0.0, 2.0, 0.0, 0.0
0.0, 0.0, 1.0, 0.0
0.0, 0.0, 0.0, 2.0

Was ich so interpretiere, dass ja eigentlich genau die y-Achse als einzige Skaliert werden sollte. Oder gibt diese Matrix nur eine Richtung an, und ist bzgl. der Anisotropie irrelevant?

Ich würde mich sehr über Ideen freuen, wie man richtungsabhängig skalieren kann.
Vielen Dank schon mal im Voraus!


----------



## Illuvatar (31. Mai 2009)

API hat gesagt.:
			
		

> Scale interpolation behavior. This class defines a behavior that modifies the *uniform scale component* of its target TransformGroup by linearly interpolating between a pair of specified scale values (using the value generated by the specified Alpha object).



Das heißt für mich, dass das mit dieser Klasse nicht geht. Der ScaleInterpolator holt sich aus deinem Transform3D nur den Ursprung des Koordinatensystems, in Bezug auf den skaliert werden soll.
Es sollte aber nicht schwer sein, selbst so einen Interpolator zu schreiben. Das sollte in etwa so gehen: (ungetestet)


```
class YScaleInterpolator extends TransformInterpolator
{
  private Vector3d scaleVector = new Vector3d(1, 1, 1);
  private float minimumScale, maximumScale;

  public YScaleInterpolator(Alpha alpha, TransformGroup target, float minimumScale, float maximumScale)
  {
    super (alpha, target);
    this.minimumScale = minimumScale;
    this.maximumScale = maximumScale;
  }

  @Override
  public void computeTransform(float alphaValue, Transform3D transform)
  {
    transform.setIdentity();
    scaleVector.y = alphaValue * maximumScale + (1 - alphaValue) * minimumScale;
    transform.setScale (scaleVector);
  }
}
```


----------



## Ariovist (31. Mai 2009)

Hallo Illuvatar,

vielen Dank für deine Antwort und den Code! Es funktioniert auf Anhieb einwandfrei. :applaus:

Auch vielen Dank für deine Erklärung. Den Satz habe ich zunächst überlesen.

Auch hätte ich zugegebener Maßen sehr lange gebraucht, um diese Klasse selber zu schreiben. Die hilft mir aber auch sehr, um zu verstehen, was im Interpolator passiert.

Also, besten Dank,
Viele Grüße


----------

