Ich mal wieder :-) - Problem mit Interpolatoren

  • Themenstarter Themenstarter Andre Schaaf
  • Beginndatum Beginndatum
Status
Nicht offen für weitere Antworten.
A

Andre Schaaf

Gast
So nagut, ich habe jetzt ewigkeiten gegoogelt und das forum nach irgendwelchen anhaltspunkten durchforstet aber leider bleibe ich irgendwie hängen.

Problem:

Wieder meine "Kamera"

Und zwar verschiebe ich die Kamera auf eine Position per PositionPathInterpolator da steht sie dann auch
Korrekt und ich bekomme wenn ich die Kamerkoordinaten abrufe ein korektes ergebniss. Füge ich dann nachdem die Bewegung fertig ist noch einen Rotationsinterpolator hinzu, versetzt mir das ding meine Kamera wieder in den Usprung und Rotiert dort, was ich aber ganz klar nicht möchte. Ich will das die Kamera sich an dem Punkt wo sie hintransliert worden ist um einen gewissen winkel auf den 3 achsen um sich selbst dreht.

Jetzt mal der Source dazu

Code:
private void AnimateTranslate(long duration) {
		this.camPos=this.camera.getCameraPosition();
    	
	    Alpha transAlpha=new Alpha(1,duration);		
	    transAlpha.setStartTime(System.currentTimeMillis()+1);
	    			   
		PositionPathInterpolator pathPositionInterpolator = new PositionPathInterpolator (transAlpha, this.camera.getTransformGroup(), new Transform3D(), new float[]{0, 1}, new Point3f[]{
	            new Point3f (this.camPos.x, this.camPos.y, this.camPos.z),
	            new Point3f (this.targetPoint.x+(float)(this.objDimension.x/2), this.targetPoint.y+(float)(this.objDimension.y/2), this.targetPoint.z+(float)(2*this.objDimension.z))  //Endpunkt
	    	});
		pathPositionInterpolator.setSchedulingBounds(new BoundingSphere());
					      											    
	    BranchGroup branchGroup = new BranchGroup();
	      
	    branchGroup.setCapability(BranchGroup.ALLOW_DETACH);	      
	    branchGroup.addChild(pathPositionInterpolator);
	    	     
	    this.camera.getTransformGroup().addChild(branchGroup);
	      	    	    
	    try {
	       Thread.sleep(duration);
	    }
	    catch (Exception ex) {}
	    
	    branchGroup.detach();	    	    
	}
	
	private void AnimateRotate(long duration) {
		this.camPos=this.camera.getCameraPosition();
		
		System.out.println(this.camPos);
		
		Alpha rotAlpha=new Alpha(1, duration);
		rotAlpha.setStartTime(System.currentTimeMillis()+1);
		
		Transform3D trans=new Transform3D();
		trans.setTranslation(new Vector3d(this.camPos.x, this.camPos.y, this.camPos.z));
				
		RotationInterpolator rotInter=new RotationInterpolator(rotAlpha,this.camera.getTransformGroup(), trans, 0,6.28f);
		rotInter.setSchedulingBounds(new BoundingSphere());
			    					      											   
	    BranchGroup branchGroup = new BranchGroup();
	      
	    branchGroup.setCapability(BranchGroup.ALLOW_DETACH);	      
	    branchGroup.addChild(rotInter);
	    	     
	    this.camera.getTransformGroup().addChild(branchGroup);
	      	    	    
	    try {
	       Thread.sleep(duration);
	    }
	    catch (Exception ex) {}
	    
	    branchGroup.detach();
	}

Wie gesagt Translation funzt ohne Probleme.

Für jegliche Hilfe wäre ich sehr dankbar.

MFG Andre
 
Am einfachsten dürfte es sein, die Kamera an ZWEI TransformGroups zu hängen, die hinterinenader hängen. Eine für die Translation, und eine für die Rotation. (Man könnte die bestimmt auch irgendwie verwursten, aber darin würde ich keinen nennenswerten Vorteil sehen - als warum sollte man sich das Leben unnötig schwer machen)

Also
TransformGroup trans = // Wird vom Translations-Interpolator verändert
TransformGroup rot =.... // Wird vom Rotations-Interpolator verändert
Camera camera = ...
rot.add(camera);
trans.add(rot);
 
Hm ok danke ich werde es mal ausprobieren und dann meine ergebnisse posten oder probleme je nach dem wies läuft.

Danke

MFG Andre
 
Ja also ich weis auch nicht .. ich finde diese Interpolatoren irgendwie nicht sehr praktikabel. Das ist alles zu verwirrend. Da bin ich fast schneller wenn ich mir ne eigene Klasse baue die meine Animationen macht als das ich diese Interpolatoren verstanden habe.

Ich meine ich komme mit denen ja unter normalen umständen ganz gut klar aber mit dieser "Kamera" will das alles nicht so wie ich das haben möchte ...

Dabei will ich doch einfach nur erst die Kamera translieren und dann rotieren ohne das der mir alles wieder an den Anfang zurücksetzt. Es wäre echt der Hammer wenn jemand dafür mal ein beispiel bringen könnte wie man sowas macht.

Ich poste mal noch den Cam Source

Code:
package renderer;

import javax.media.j3d.Canvas3D;
import javax.media.j3d.Transform3D;
import javax.media.j3d.TransformGroup;
import javax.vecmath.Point3d;
import javax.vecmath.Point3f;
import javax.vecmath.Vector3d;
import javax.vecmath.Vector3f;

import core.Spe3DVis;

public class Camera {
	private Spe3DVis speedVis;	
	
	public Camera(Spe3DVis speedVis) {
		this.speedVis=speedVis;
	}
	
	public Point3f getCameraPosition() {
		Point3f camPos=new Point3f();
		
		TransformGroup transGrp=this.speedVis.getVisRenderer().getSimpleUniverse().getViewingPlatform().getViewPlatformTransform();
		Transform3D trans3d=new Transform3D();
		transGrp.getTransform(trans3d);
		
		Vector3d vec=new Vector3d();
		trans3d.get(vec);
		
		camPos.x=(float)vec.x;
		camPos.y=(float)vec.y;
		camPos.z=(float)vec.z;
		
		return camPos;
	}
	
	public void TranslateCamera(float x, float y, float z) {
		TransformGroup transGroup=this.speedVis.getVisRenderer().getSimpleUniverse().getViewingPlatform().getViewPlatformTransform();
		Transform3D trans=new Transform3D();
		
		transGroup.getTransform(trans);
		trans.setTranslation(new Vector3f(x,y,z));
		transGroup.setTransform(trans);
	}
	
	public void TranslateCamera(Vector3f transPoint) {
		TransformGroup transGroup=this.speedVis.getVisRenderer().getSimpleUniverse().getViewingPlatform().getViewPlatformTransform();
		Transform3D trans=new Transform3D();
		
		transGroup.getTransform(trans);
		trans.setTranslation(transPoint);
		transGroup.setTransform(trans);
	}
	
	public void RotateCamera(float degreeX, float degreeY, float degreeZ) {
		TransformGroup transformGroup=this.speedVis.getVisRenderer().getSimpleUniverse().getViewingPlatform().getViewPlatformTransform();
		Transform3D trans=new Transform3D();
		
		transformGroup.getTransform(trans);
		trans.rotY(-1.57);
		transformGroup.setTransform(trans);
	}
	
	public TransformGroup getTransformGroup() {
		return this.speedVis.getVisRenderer().getSimpleUniverse().getViewingPlatform().getViewPlatformTransform();
	}
	
	public Point3d GetPointOfView() {
		Point3d viewPoint=new Point3d();
		
		Point3d eye_pos = new Point3d();
		Point3d mouse_pos = new Point3d();
		
		Canvas3D canvas=this.speedVis.getVisRenderer().getDrawCanvas();

		canvas.getCenterEyeInImagePlate(eye_pos);
		canvas.getPixelLocationInImagePlate(canvas.getWidth()/2, canvas.getHeight()/2, mouse_pos);

		Transform3D motion = new Transform3D();
		canvas.getImagePlateToVworld(motion);
		motion.transform(eye_pos);
		motion.transform(mouse_pos);

		Vector3d direction = new Vector3d(mouse_pos);
		direction.sub(eye_pos);

		viewPoint.x=direction.x;
		viewPoint.y=direction.y;
		viewPoint.z=direction.z;
		
		return viewPoint;
	}
}
 
Status
Nicht offen für weitere Antworten.

Zurück
Oben