Problem mit Positionsinterpolator

Sixty

Mitglied
Moin,

bin gerade dabei eine Java 3D animation zu coden.
Ich habe eine Transformationspruppe(bestehend aus 4 BOXen) schon in der y-Achse nach oben bewegt.
Diese Gruppe soll sich dann(oben angelangt) auf der X-Achse nach rechts bewegen.
Wie kann man mehrere Positionsinterpolatoren auf eine Gruppe anwenden? Gibt es vll. die Möglichkeit Gruppen mit neuer Deklaration zu dublizieren?

Hier meine Codeschnipsel
Code:
// Gruppierung der kleinen Scheibe 

		Transform3D tfKlScheibe = new Transform3D();
		TransformGroup tgKlScheibe = new TransformGroup(tfKlScheibe);
		tgKlScheibe.addChild(tgScheibeKlein);
		tgKlScheibe.addChild(tgScheibeKlein1);
		tgKlScheibe.addChild(tgScheibeKlein2);
		tgKlScheibe.addChild(tgScheibeKlein3);

// Animation******************************************

		int timeAcc = 3000;

		int dauerAni = 1000;// Die Scheibe soll in 2
		// Sekundenaufsteigen.

		int timeHovering = 1000;// Sie soll eine Sekunden in der Hoehe verharren.
		

		int timeFlightStart = 2000;

		// Definiere die Bewegung.

		Transform3D tfhelicopterFlightAxis = new Transform3D();
		tfhelicopterFlightAxis.rotY(1.55);
		
		
		
		Transform3D tfhelicopterFlightAxis2 = new Transform3D();
		
		tfhelicopterFlightAxis2.rotX(1.55);
		
		


		// Das Alpha fuer die Hubschrauberbewegung.
		Alpha helicopterAlpha = new Alpha(1, Alpha.INCREASING_ENABLE,
				timeFlightStart, 0, dauerAni, timeAcc, timeHovering,
				dauerAni, timeAcc, 0);

		// Die Hubschrauberbewegung
		PositionInterpolator posIPHelicopter = new PositionInterpolator(
				helicopterAlpha, tgKlScheibe, tfhelicopterFlightAxis, 0.0f, 0.5f);
		
		PositionInterpolator posIPHelicopter2 = new PositionInterpolator(
				helicopterAlpha, tgKlScheibe, tfhelicopterFlightAxis2, 0.0f, 0.5f);
		
		

		BoundingSphere bounds = new BoundingSphere(new Point3d(0.0, 0.0, 0.0),
				Double.MAX_VALUE);
		
		

		posIPHelicopter.setSchedulingBounds(bounds);
		posIPHelicopter2.setSchedulingBounds(bounds);

	// Fuege die Bewegung zur Hubschraubertransformationsgruppe.
		tgKlScheibe.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
		tgKlScheibe.addChild(posIPHelicopter);
                tgKlScheibe.addChild(posIPHelicopter2);

BranchGroup theScene = new BranchGroup();
		theScene.addChild(tgBlub);
		theScene.addChild(tgGrScheibe);
		theScene.addChild(tgKlScheibe);
		
	

		Background bg = new Background(new Color3f(1.0f, 1.0f, 1.0f));

		bg.setApplicationBounds(bounds);
		theScene.addChild(bg);

		theScene.compile();

		// Hinzufuegen der Szene
		su.addBranchGraph(theScene);

Hat jemand eine Idee?
 
Hallo,

Du kannst einer neuen Transformgruppe tgKlScheibe hinzufügen.
Einem der Positionsinterpolatoren kannst du dann die neu erstellte Transformgruppe statt tgKlScheibe als Argument übergeben. Der BranchGroup theScene fügst du auch die neue Transformgruppe statt tgKlScheibe zu und setzt die Capabilities.
 
Erstmal Danke für die Hilfe,

hab dich vll nicht richtig verstanden, mein Code sieht jetzt so aus:

Code:
		int timeAcc = 3000;

		int dauerAni = 1000;// Die Scheibe soll in 2
		// Sekundenaufsteigen.

		int timeHovering = 1000;// Sie soll eine Sekunden in der Hoehe verharren.
		

		int timeFlightStart = 2000;

		// Definiere die Bewegung.

		Transform3D tfhelicopterFlightAxis = new Transform3D();
		tfhelicopterFlightAxis.rotZ(1.55);
		
		
		
		Transform3D tfhelicopterFlightAxis2 = new Transform3D();
		
		tfhelicopterFlightAxis2.rotX(1.55);
		
        Transform3D tfAni = new Transform3D();
	    
        TransformGroup tgAni = new TransformGroup(tfAni);
	 tgAni.addChild(tgKlScheibe);
	    
	    

		// Das Alpha fuer die Hubschrauberbewegung.
		Alpha helicopterAlpha = new Alpha(1, Alpha.INCREASING_ENABLE,
				timeFlightStart, 0, dauerAni, timeAcc, timeHovering,
				dauerAni, timeAcc, 0);

		// Die Hubschrauberbewegung
		PositionInterpolator posIPHelicopter = new PositionInterpolator(
				helicopterAlpha, tgAni, tfhelicopterFlightAxis, 0.0f, 0.5f);
		
		PositionInterpolator posIPHelicopter2 = new PositionInterpolator(
				helicopterAlpha, tgKlScheibe, tfhelicopterFlightAxis2, 0.0f, 0.5f);
		
		

		BoundingSphere bounds = new BoundingSphere(new Point3d(0.0, 0.0, 0.0),
				Double.MAX_VALUE);
		
		

		posIPHelicopter.setSchedulingBounds(bounds);
		posIPHelicopter2.setSchedulingBounds(bounds);

		
		
		
		
	// Fuege die Bewegung zur Hubschraubertransformationsgruppe.
		
		tgAni.addChild(posIPHelicopter);
        tgKlScheibe.addChild(posIPHelicopter2);

BranchGroup theScene = new BranchGroup();
		theScene.addChild(tgBlub);
		theScene.addChild(tgGrScheibe);
		theScene.addChild(tgAni);

                tgAni.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
		tgKlScheibe.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
		

		Background bg = new Background(new Color3f(1.0f, 1.0f, 1.0f));

		bg.setApplicationBounds(bounds);
		theScene.addChild(bg);

		theScene.compile();

		// Hinzufuegen der Szene
		su.addBranchGraph(theScene);

Das Objekt steigt jetzt schräg nach oben, also er führt beide Interpolatoren gleichzeitig aus :(
Hab ich vll etwas an der Reihenfolge vertauscht?

Danke
 
Ich bin mir jetzt nicht sicher.
Müsste es nicht:
Code:
posIPHelicopter.getAlpha().pause(long);
heißen?
Nach der Erzeugung des Interpolators könnte es hinpassen.
Vielleicht musst du aber die Verschiebung noch anpassen.

Du könntest aber auch zwei Alphaobjekte für jeden Interpolator am Anfang des Programms erzeugen, um das erste sofort mit pause() stoppen zu können. Mit zwei AlphaObjekten könntest du vielleicht auch auf pause() verzichten und den Ablauf nur mit den Startzeiten steuern.
 
Zuletzt bearbeitet:
Zurück