Richtungsabhängiges Skalieren mit Interpolator

Status
Nicht offen für weitere Antworten.

Ariovist

Mitglied
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
Code:
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
Code:
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

Top Contributor
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)

Java:
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

Mitglied
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
 
Status
Nicht offen für weitere Antworten.

Oben