Java3D: automatisches Bewegen der Kamera

Status
Nicht offen für weitere Antworten.

veritas696

Mitglied
Hallo,

Ich möchte eine Kamera haben die sich innerhalb meines Sonnensystems mit einem Planeten mitbewegt. Das heißt sie soll "hinter" dem Planeten installiert sein und in richtig Sonne schauen.

Verwende ich den folgenden Quellcode so ist die Kamera beim Start des Programms korrekt hinter dem Planeten, doch bewegt sich nicht mit dem Planeten mit, kann mir einer erklären warum?


[highlight=Java]public class Planet
{
////////////////////////////////////////////////////////////////////////////////////
// MEMBERS
// Planeten eigenschaften
private float size = 0; // Größe des Planeten
private float ownRotDuration = 0; // EigenRotationsdauer
private float distanceToCenter = 0; // Entfernung zum Zentralgestirn
protected float centerRotDuration = 0; // Rotationsdauer um Zentralgestirn
private float ownNeigung = 0;
// Planet selbst
private Sphere sphere = null; // Die Kugel selbst

// Oberflächeneigenschaften
private String texString = "";

private boolean texActivated = true;

// Eigenlicht
//private AmbientLight ownALight = new AmbientLight(new Color3f(1f, 1f, 1f));

//private DirectionalLight DLgt = new DirectionalLight( new Color3f(1f, 1f, 1f),
// new Vector3f(-0.5f,-0.5f,-1f));

// BranchGroup (Planetensystem)
public BranchGroup RootBG = new BranchGroup(); // Root Objekt

// Transformationsgruppe (eigene Rotation, Neigung)
private TransformGroup SphereTG = new TransformGroup(); // Transformationen für die Kugel
private Transform3D SphereT3D = new Transform3D(); // Transformierungen für die Kugel
//Rotationswerkzeuge für den Planeten (Eigenrotation)
private TransformGroup ownRotTG = new TransformGroup(); // Transformationen für die Rotation
private RotationInterpolator ownRotator;
private Alpha ownRotationAlpha;

// Transformationsgruppe (Rotation ums Zentralgestirn)
protected TransformGroup CenterTG = new TransformGroup();
private Transform3D CenterT3D = new Transform3D(); // Transformierungen für die Kugel
//Rotationswerkzeuge für den Planeten (Rotation um Zentralgestirn)
private TransformGroup centerRotTG = new TransformGroup(); // Transformationen für die Rotation
private RotationInterpolator centerRotator;
private Alpha centerRotationAlpha;

// Umlaufbahn der PlanetenKamera
private TransformGroup CamTG = new TransformGroup(); // Transformationen für die Kamera
private Transform3D CamT3D = new Transform3D(); // Transformierungen für die Kamera

static int i = 0;

////////////////////////////////////////////////////////////////////////////////////
// Konstruktoren
public Planet(float size, float ownRotDuration, float distanceToCenter,
float centerRotDuration, float ownNeig, String tex)
{
this.size = size;
this.ownRotDuration = ownRotDuration;
this.distanceToCenter = distanceToCenter;
this.centerRotDuration = centerRotDuration;
this.ownNeigung = ownNeig;
this.texString = tex;

this.initObject(); // Erscheinungsbild festlegen
}

////////////////////////////////////////////////////////////////////////////////////
// Functions
/////////////////////////////////////////////////////////////////////////////////////
private void initObject()
{
this.initRotations();

// Objekt anlegen
sphere = new Sphere(size, Sphere.GENERATE_NORMALS
| Sphere.GENERATE_TEXTURE_COORDS, 64,
new PlanetAppearance(texString));

// festgelegte Rotation(zb. Erdachsenneigung)
if (ownNeigung != 0.0) {
SphereT3D.setRotation(new AxisAngle4f(1f, 0f, 0f, (float) Math
.toRadians(-ownNeigung)));
}

// Position festlegen
SphereT3D.setTranslation(new Vector3f(0.0f, 0f, -distanceToCenter));

SphereTG.setTransform(SphereT3D);

// Position der Kamera festlegen
CamT3D.setTranslation(new Vector3f(0.0f, 0f, -distanceToCenter - 20));
CamTG.setTransform(CamT3D);
//CamTG.addChild(centerRotator);

// TODO: wieder entfernen wenn Planeten Kamera funktioniert
CamTG.addChild(new Sphere(0.2f, Sphere.GENERATE_NORMALS
| Sphere.GENERATE_TEXTURE_COORDS, 64, new Appearance()));
CamTG.setCapability(TransformGroup.ALLOW_CHILDREN_EXTEND);
CamTG.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
CamTG.setCapability(TransformGroup.ALLOW_CHILDREN_READ);
CamTG.setCapability(TransformGroup.ALLOW_CHILDREN_WRITE);

// eigene Rotation festlegen
SphereTG.addChild(ownRotTG);
SphereTG.setCapability(TransformGroup.ALLOW_CHILDREN_EXTEND);
ownRotTG.addChild(sphere);
ownRotTG.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
ownRotTG.setCapability(TransformGroup.ALLOW_CHILDREN_READ);
ownRotTG.setCapability(TransformGroup.ALLOW_CHILDREN_WRITE);
//ownRotTG.setCapability(TransformGroup.);

SphereTG.addChild(ownRotator);

// Rotation ums Zentralgestirn
CenterTG.addChild(centerRotTG);

centerRotTG.addChild(SphereTG);
centerRotTG.addChild(CamTG); // Kamera um ZG rotieren

centerRotTG.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);

CenterTG.addChild(centerRotator);
CenterTG.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
CenterTG.setCapability(TransformGroup.ALLOW_CHILDREN_READ);
CenterTG.setCapability(TransformGroup.ALLOW_CHILDREN_WRITE);

// Oribts entfernen/ hinzufügen
CenterTG.setCapability(TransformGroup.ALLOW_CHILDREN_EXTEND);

}

///////////////////////////////////////////////////////////////////////////////////////////////
private void initRotations()
{
// Eigenrotation
ownRotationAlpha = new Alpha(-1, // loopCount -1 = endlos
/*Alpha.DECREASING_ENABLE|*/Alpha.INCREASING_ENABLE, // mode, welche Parts sollen durchlaufen werden
0, // triggerTime, wann soll Rotation beginnen 0=sofort
0, // phaseDelayDuration, wann soll Rotation beginnen 0=sofort

//increasing Part
(int) ownRotDuration, // increasingAlphaDuration in msec (Rotationsgeschwindigkeit)
0, // increasingAlphaRampDuration Beschleunigung (brauch ich net)
0, // alphaAtOneDuration

// decreasing Part / wird nicht betrachtet wenn nur INCREASING_ENABLE gesetzt
9000, // decreasingAlphaDuration
3000, // decreasingAlphaRampDuration
500); // alphaAtZeroDuration
ownRotator = new RotationInterpolator(ownRotationAlpha, ownRotTG);
ownRotator.setMinimumAngle(0f);
ownRotator.setMaximumAngle((float) Math.toRadians(360));
ownRotator.setSchedulingBounds(Universe.BigBounds);

// Rotation ums Zentralgestirn
centerRotationAlpha = new Alpha(-1, // loopCount -1 = endlos
//Alpha.DECREASING_ENABLE|
Alpha.INCREASING_ENABLE, // mode, welche Parts sollen durchlaufen werden
0, // triggerTime, wann soll Rotation beginnen 0=sofort
0, // phaseDelayDuration, wann soll Rotation beginnen 0=sofort

//increasing Part
(int) centerRotDuration, // increasingAlphaDuration in msec (Rotationsgeschwindigkeit)
0, // increasingAlphaRampDuration Beschleunigung (brauch ich net)
0, // alphaAtOneDuration

// decreasing Part / wird nicht betrachtet wenn nur INCREASING_ENABLE gesetzt
9000, // decreasingAlphaDuration
3000, // decreasingAlphaRampDuration
500); // alphaAtZeroDuration
centerRotator = new RotationInterpolator(centerRotationAlpha, centerRotTG);
centerRotator.setMinimumAngle(0f);
centerRotator.setMaximumAngle((float) Math.toRadians(360));

//TODO: ist hier bigbounds nötig?, wofür steht schedulingBounds?
centerRotator.setSchedulingBounds(Universe.BigBounds);

}

///////////////////////////////////////////////////////////////////////////////////////////////
public void addChild(Planet planet)
{
SphereTG.addChild(planet.createSceneGraph());
}

////////////////////////////////////////////////////////////////////////////////////////////////
// Erstellung des Planeten
public BranchGroup createSceneGraph()
{
System.out.println("createPlanet: " + (i++));

RootBG.addChild(CenterTG);

RootBG.compile();
return RootBG;
}

/////////////////////////////////////////////////////////////////////////////

/////////////////////////////////////////////////////////////////////////////
public TransformGroup getCamTG()
{
return CamTG;
}
}
[/highlight]


Die folgendene Klasse stellt meine Kamera da. im Konstruktor wird die ViewPlatformTransform übergeben
---->u.getViewingPlatform().getViewPlatformTransform()

[highlight=Java]
public class Camera extends BranchGroup
{
private TransformGroup transformGroup;
private Transform3D ViewT3D = new Transform3D();

/////////////////////////////////////////////////////////////////////////////////
public Camera(TransformGroup tg)
{
transformGroup = tg;

enablePlanetCamera(ObjectManager.planetErde);

}

/////////////////////////////////////////////////////////////////////////////////
public void enablePlanetCamera(Planet currentPlanet)
{

// aktuelle Transformation des Planeten holen
TransformGroup ViewTG = currentPlanet.getCamTG();
ViewTG.getTransform(ViewT3D);

// Rotation der Kamera um 180 grad auf die Sonne
ViewT3D.setRotation(new AxisAngle4f(0, -1, 0, (float) Math.toRadians(180)));

transformGroup.setTransform(ViewT3D);

}
}
[/highlight]


hoffe das erschlägt euch nicht und es ist einigermaßen verständlich :bahnhof:
 
Zuletzt bearbeitet von einem Moderator:

Ebenius

Top Contributor
Allgemeiner Hinweis: Weniger Slash's und mehr Einrückung würden die Lesbarkeit enorm erhöhen!

Ebenius
 

veritas696

Mitglied
Also bei mir im Eclipse saß noch gut aus, nach Kopieren ins Notepad und dann hierrein, hat sich halt alles verschoben, sry
 

Developer_X

Top Contributor
veritas123...
ich hatte einst genau das selbe Problem, und ich habe es nie gelöst bis vor kurzem, nun möchte ich dir helfen, vertrau mir, du brauchst keine Zweite Klasse namens "Kamera"
Hier ist die Lösung:
[highlight=Java]

import java.awt.BorderLayout;
import java.awt.GraphicsConfiguration;

import javax.media.j3d.Alpha;
import javax.media.j3d.Appearance;
import javax.media.j3d.BoundingSphere;
import javax.media.j3d.BranchGroup;
import javax.media.j3d.Canvas3D;
import javax.media.j3d.RotationInterpolator;
import javax.media.j3d.Transform3D;
import javax.media.j3d.TransformGroup;
import javax.swing.JFrame;
import javax.vecmath.AxisAngle4f;
import javax.vecmath.Point3d;
import javax.vecmath.Vector3f;

import com.sun.j3d.utils.geometry.Sphere;
import com.sun.j3d.utils.universe.SimpleUniverse;

public class Planet extends JFrame
{
////////////////////////////////////////////////////////////////////////////////////
// MEMBERS
float pos = 1;
Vector3f vct;
Transform3D ViewT3D;
TransformGroup ViewTG;
// Planeten eigenschaften
private float size = 0; // Größe des Planeten
private float ownRotDuration = 0; // EigenRotationsdauer
private float distanceToCenter = 0; // Entfernung zum Zentralgestirn
protected float centerRotDuration = 0; // Rotationsdauer um Zentralgestirn
private float ownNeigung = 0;
private SimpleUniverse u;
// Planet selbst
private Sphere sphere = null; // Die Kugel selbst


// Oberflächeneigenschaften
private String texString = "";

private boolean texActivated = true;

// Eigenlicht
//private AmbientLight ownALight = new AmbientLight(new Color3f(1f, 1f, 1f));

//private DirectionalLight DLgt = new DirectionalLight( new Color3f(1f, 1f, 1f),
// new Vector3f(-0.5f,-0.5f,-1f));

// BranchGroup (Planetensystem)
public BranchGroup RootBG = new BranchGroup(); // Root Objekt

// Transformationsgruppe (eigene Rotation, Neigung)
private TransformGroup SphereTG = new TransformGroup(); // Transformationen für die Kugel
private Transform3D SphereT3D = new Transform3D(); // Transformierungen für die Kugel
//Rotationswerkzeuge für den Planeten (Eigenrotation)
private TransformGroup ownRotTG = new TransformGroup(); // Transformationen für die Rotation
private RotationInterpolator ownRotator;
private Alpha ownRotationAlpha;

// Transformationsgruppe (Rotation ums Zentralgestirn)
protected TransformGroup CenterTG = new TransformGroup();
private Transform3D CenterT3D = new Transform3D(); // Transformierungen für die Kugel
//Rotationswerkzeuge für den Planeten (Rotation um Zentralgestirn)
private TransformGroup centerRotTG = new TransformGroup(); // Transformationen für die Rotation
private RotationInterpolator centerRotator;
private Alpha centerRotationAlpha;

// Umlaufbahn der PlanetenKamera
private TransformGroup CamTG = new TransformGroup(); // Transformationen für die Kamera
private Transform3D CamT3D = new Transform3D(); // Transformierungen für die Kamera


static int i = 0;


////////////////////////////////////////////////////////////////////////////////////
// Konstruktoren
public Planet(float size, float ownRotDuration, float distanceToCenter, float centerRotDuration, float ownNeig, String tex)
{
this.size = size;
this.ownRotDuration = ownRotDuration;
this.distanceToCenter = distanceToCenter;
this.centerRotDuration = centerRotDuration;
this.ownNeigung = ownNeig;
this.texString = tex;


this.initObject(); // Erscheinungsbild festlegen
}

////////////////////////////////////////////////////////////////////////////////////
// Functions
/////////////////////////////////////////////////////////////////////////////////////
private void initObject()
{
this.initRotations();

// Objekt anlegen
sphere = new Sphere(size, Sphere.GENERATE_NORMALS | Sphere.GENERATE_TEXTURE_COORDS,
64, null);

// festgelegte Rotation(zb. Erdachsenneigung)
if(ownNeigung != 0.0)
{
SphereT3D.setRotation(new AxisAngle4f(1f,0f,0f,(float)Math.toRadians(-ownNeigung)));
}

// Position festlegen
SphereT3D.setTranslation(new Vector3f(0.0f, 0f,-distanceToCenter));

SphereTG.setTransform(SphereT3D);

// Position der Kamera festlegen
CamT3D.setTranslation(new Vector3f(0.0f, 0f, -distanceToCenter - 20));
CamTG.setTransform(CamT3D);
//CamTG.addChild(centerRotator);

// TODO: wieder entfernen wenn Planeten Kamera funktioniert
CamTG.addChild(new Sphere(0.2f, Sphere.GENERATE_NORMALS | Sphere.GENERATE_TEXTURE_COORDS,
64, new Appearance()));
CamTG.setCapability(TransformGroup.ALLOW_CHILDREN_EXTEND);
CamTG.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
CamTG.setCapability(TransformGroup.ALLOW_CHILDREN_READ);
CamTG.setCapability(TransformGroup.ALLOW_CHILDREN_WRITE);

// eigene Rotation festlegen
SphereTG.addChild(ownRotTG);
SphereTG.setCapability(TransformGroup.ALLOW_CHILDREN_EXTEND);
ownRotTG.addChild(sphere);
ownRotTG.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
ownRotTG.setCapability(TransformGroup.ALLOW_CHILDREN_READ);
ownRotTG.setCapability(TransformGroup.ALLOW_CHILDREN_WRITE);
//ownRotTG.setCapability(TransformGroup.);

SphereTG.addChild(ownRotator);


// Rotation ums Zentralgestirn
CenterTG.addChild(centerRotTG);

centerRotTG.addChild(SphereTG);
centerRotTG.addChild(CamTG); // Kamera um ZG rotieren

centerRotTG.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);

CenterTG.addChild(centerRotator);
CenterTG.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
CenterTG.setCapability(TransformGroup.ALLOW_CHILDREN_READ);
CenterTG.setCapability(TransformGroup.ALLOW_CHILDREN_WRITE);

// Oribts entfernen/ hinzufügen
CenterTG.setCapability(TransformGroup.ALLOW_CHILDREN_EXTEND);


}

///////////////////////////////////////////////////////////////////////////////////////////////
private void initRotations()
{
// Eigenrotation
BoundingSphere BigBounds = new BoundingSphere(new Point3d(),1000);
ownRotationAlpha = new Alpha(
-1, // loopCount -1 = endlos
/*Alpha.DECREASING_ENABLE|*/Alpha.INCREASING_ENABLE, // mode, welche Parts sollen durchlaufen werden
0, // triggerTime, wann soll Rotation beginnen 0=sofort
0, // phaseDelayDuration, wann soll Rotation beginnen 0=sofort

//increasing Part
(int)ownRotDuration, // increasingAlphaDuration in msec (Rotationsgeschwindigkeit)
0, // increasingAlphaRampDuration Beschleunigung (brauch ich net)
0, // alphaAtOneDuration

// decreasing Part / wird nicht betrachtet wenn nur INCREASING_ENABLE gesetzt
9000, // decreasingAlphaDuration
3000, // decreasingAlphaRampDuration
500); // alphaAtZeroDuration
ownRotator = new RotationInterpolator(ownRotationAlpha,ownRotTG);
ownRotator.setMinimumAngle(0f);
ownRotator.setMaximumAngle((float)Math.toRadians(360));
ownRotator.setSchedulingBounds(BigBounds);


// Rotation ums Zentralgestirn
centerRotationAlpha = new Alpha(
-1, // loopCount -1 = endlos
//Alpha.DECREASING_ENABLE|
Alpha.INCREASING_ENABLE, // mode, welche Parts sollen durchlaufen werden
0, // triggerTime, wann soll Rotation beginnen 0=sofort
0, // phaseDelayDuration, wann soll Rotation beginnen 0=sofort

//increasing Part
(int)centerRotDuration, // increasingAlphaDuration in msec (Rotationsgeschwindigkeit)
0, // increasingAlphaRampDuration Beschleunigung (brauch ich net)
0, // alphaAtOneDuration

// decreasing Part / wird nicht betrachtet wenn nur INCREASING_ENABLE gesetzt
9000, // decreasingAlphaDuration
3000, // decreasingAlphaRampDuration
500); // alphaAtZeroDuration
centerRotator = new RotationInterpolator(centerRotationAlpha,centerRotTG);
centerRotator.setMinimumAngle(0f);
centerRotator.setMaximumAngle((float)Math.toRadians(360));

//TODO: ist hier bigbounds nötig?, wofür steht schedulingBounds?
centerRotator.setSchedulingBounds(BigBounds);

}
///////////////////////////////////////////////////////////////////////////////////////////////
public void addChild(Planet planet)
{
SphereTG.addChild(planet.createSceneGraph());
}
////////////////////////////////////////////////////////////////////////////////////////////////
// Erstellung des Planeten
public BranchGroup createSceneGraph()
{
System.out.println("createPlanet: "+(i++));

RootBG.addChild(CenterTG);

//Hier View Initialisation!
//////////
//View Initialisation
ViewTG = new TransformGroup();
ViewTG.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
ViewTG=u.getViewingPlatform().getViewPlatformTransform();
ViewT3D = new Transform3D();
ViewTG.getTransform(ViewT3D);
vct = new Vector3f(pos,0,0);
ViewT3D.setTranslation(vct);
ViewTG.setTransform(ViewT3D);

(new Thread(){@Override public void run(){while(!isInterrupted()){
pos = pos + 0.05f;
vct = new Vector3f(pos,0,0);
ViewT3D.setTranslation(vct);
ViewTG.setTransform(ViewT3D);

try{sleep(10);}catch(InterruptedException e){interrupt();}}}}).start();
///////////////////////////
RootBG.compile();
return RootBG;
}
/////////////////////////////////////////////////////////////////////////////

/////////////////////////////////////////////////////////////////////////////
public TransformGroup getCamTG()
{
return CamTG;
}

public Planet()
{
setSize(500,500);
setTitle("Planet");
setVisible(true);
setLayout(null);
GraphicsConfiguration config1 = SimpleUniverse.getPreferredConfiguration();
Canvas3D canvas1 = new Canvas3D(config1);
canvas1.setBounds(0,0,500,500);
u = new SimpleUniverse(canvas1);
u.addBranchGraph(createSceneGraph());
add(canvas1,BorderLayout.SOUTH);
}
public static void main(String[]args)
{
new Planet();
}
}[/highlight]
Wie du sehen kannst hab ich deins so weit übernommen
PS:
Das wird bei dir aber immer noch nicht funktionieren weil du keine Lichquellen eingefügt hast,
wenn du willst kanns´t dus ja noch machen, wenn du net weißt wie, dann kann ich dir das machen
du musst es nur sagen
 
Zuletzt bearbeitet:

hdi

Top Contributor
ich hatte einst genau das selbe Problem, und ich habe es nie gelöst bis vor kurzem, nun möchte ich dir helfen, vertrau mir, du brauchst keine Zweite Klasse namens "Kamera"
Hier ist die Lösung:

Vorab: Ich hab den Code nicht gesehen, und ich will Developer nicht unterstellen, dass
der Code nicht funktioniert. Aber jeder, der diesen Code verwenden will sollte wissen:
Developer ist noch zu wacklig auf den Beinen in Sachen Java, als dass man ihm mal eben so
"vertrauen" kann.
Das meiste von seinem Code suckt big time!
Also etwas Vorsicht ;)

edit: Nich dass manche anonymen Feiglinge schon wieder sagen, ich sei das grösste
Arschloch hier und mach alle fertig.
Falls es jmd wieder zu krass vorkommt: So soll es nicht rüberkommen!
Ich will nur sagen man sollte etwas aufpassen, weil man einem Anfänger nun mal nicht
aus der Hand fressen sollte (gilt eig. genausogut für Profis)
 
Zuletzt bearbeitet:

Developer_X

Top Contributor
hdi
==
hilft dir immer lol
==============
Konzentrier dich auf das Thema!!!
PS:
Ich habe die Lösung erst vor kurzem gefunden, aber sie funktioniert zu deiner Info!!!
 

Developer_X

Top Contributor
Naja, deins funktioniert bei mir eh nicht so richtig, aber wie du das machen kannst, dass man die kamera mit hilfe eines Threads bewegen kann ist hier drin:
Code:
import java.awt.Dimension;
import java.awt.GraphicsConfiguration;
import java.awt.Toolkit;
import javax.media.j3d.AmbientLight;
import javax.media.j3d.Appearance;
import javax.media.j3d.BoundingSphere;
import javax.media.j3d.BranchGroup;
import javax.media.j3d.Canvas3D;
import javax.media.j3d.TextureAttributes;
import javax.media.j3d.Transform3D;
import javax.media.j3d.TransformGroup;
import javax.swing.JFrame;
import javax.vecmath.Color3f;
import javax.vecmath.Color4f;
import javax.vecmath.Point3d;
import javax.vecmath.Vector3d;
import javax.vecmath.Vector3f;

import com.sun.j3d.utils.geometry.Box;
import com.sun.j3d.utils.image.TextureLoader;
import com.sun.j3d.utils.universe.SimpleUniverse;

public class Trailer_3 extends JFrame
{
    float pos = 1;
	SimpleUniverse u;
	
	Vector3f vct;
	Transform3D ViewT3D;
	TransformGroup ViewTG;
	  public Trailer_3()
	  {
		  Toolkit tk = Toolkit.getDefaultToolkit();
		    final Dimension d = tk.getScreenSize();		 	
		    
		    setSize(d);
		    setTitle("R.a.t.r.o.t.c.p.");
		 
		    setUndecorated(true);
		    
		    setVisible(true);
		    setLayout(null);
		    
		     GraphicsConfiguration config1 = SimpleUniverse.getPreferredConfiguration();
		     Canvas3D canvas1 = new Canvas3D(config1);
		  	 canvas1.setBounds(0,0,d.width,d.height);
		  	 u = new SimpleUniverse(canvas1);
		  	 u.addBranchGraph(createSceneGraph1());
		  	 add(canvas1);
	  }
	  
	  public BranchGroup createSceneGraph1()
	     {
	     BranchGroup          BG = new BranchGroup();
	     // Prepare Apperances
	     Appearance Sky = new Appearance();
	     Sky.setTexture((new TextureLoader("F:/Rayman/Films/Trailer/Sky.jpg",null)).getTexture());
	     Sky.setTextureAttributes(new TextureAttributes(TextureAttributes.MODULATE,new Transform3D(),new Color4f(),TextureAttributes.FASTEST));
	     
	     Appearance Floor = new Appearance();
	     Floor.setTexture((new TextureLoader("F:/Rayman/Films/Trailer/Floor.jpg",null)).getTexture());
	     Floor.setTextureAttributes(new TextureAttributes(TextureAttributes.MODULATE,new Transform3D(),new Color4f(),TextureAttributes.FASTEST));
	     
	    
	     ///Lights
	     //1
	     AmbientLight         L1 =new AmbientLight(new Color3f(0.8f,0.8f,0.8f));
	     Point3d p1 = new Point3d(0,0,0);	     
	     BoundingSphere       LB1 =new BoundingSphere(p1,100000);
	     L1.setInfluencingBounds(LB1); BG.addChild(L1);
	    
	    ///Real World
	     Transform3D a = new Transform3D();
	     a.setTranslation(new Vector3d(0,0,-12));
	     TransformGroup A = new TransformGroup();
	     A.setTransform(a);BG.addChild(A); A.addChild(new Box(20,4,2,Box.GENERATE_NORMALS|Box.GENERATE_TEXTURE_COORDS,Sky));
	     
	  	     ///Trees	     
	     Transform3D t = new Transform3D();
	     t.setScale(2);
	     t.setTranslation(new Vector3f(20,-1,-9.5f));
	     TransformGroup T = new TransformGroup();
	     T.setTransform(t); BG.addChild(T); T.addChild(new Model().getModel("tree.obj"));

	    	     //View Initialisation
	     ViewTG = new TransformGroup();
	     ViewTG.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);	
	     ViewTG=u.getViewingPlatform().getViewPlatformTransform();
	     ViewT3D = new Transform3D();
	     ViewTG.getTransform(ViewT3D);
	     vct = new Vector3f(pos,0,0);
	     ViewT3D.setTranslation(vct);
	     ViewTG.setTransform(ViewT3D);

(new Thread(){@Override public void run(){while(!isInterrupted()){       
	   				pos = pos + 0.05f;
	   				vct = new Vector3f(pos,0,0);
	   				ViewT3D.setTranslation(vct);
	   				ViewTG.setTransform(ViewT3D);
	   				
try{sleep(10);}catch(InterruptedException e){interrupt();}}}}).start();

//////////	     
	     BG.compile();
	     return BG;
	     }
	  
	  public static void main(String[]args)
	  {
		  new Trailer_3();
	  }
	public static void warte(long millis){try{Thread.sleep(millis);}catch(InterruptedException e){}}
}
PS:
Probier den aus!
 

veritas696

Mitglied
@Developer: in deinem ersten Post sehe ich leider absolut nichts was mich weiterbringen würde :-( beim 2. (das mit dem Thread) is zwar ganz nett aber dabei fehlt vollig der Bezug zur Bewegung des Planeten.

P.S.: kennt jemand ein gutes Forum an daß mich mich wenden kann ?
 

hdi

Top Contributor
Das hier ist ein gutes Forum (@mods 50 pfennig auf mein konto bitte ;))

Warte doch erstmal ab, es wird bestimmt jemand hier reinschauen der sich mit Java3D
auskennt.
Wie du schon am Wortlaut erkennen kannst, kenne ich mich nicht damit aus ;)
 

Illuvatar

Top Contributor
Soweit ich da gerade auf Anhieb durchblicke, ist es ja auch so, dass du die Kamera nur einmal mit dem Planeten "synchronisierst", nämlich in der enablePlanetCamera-Methode. Da wird allerdings nur die Transformation von der camTG auf die Kamera "kopiert".
Leider kenne ich keine Möglichkeit, die Kamera tatsächlich irgendwo anders in den SceneGraph einzuhängen. Die beste Lösung wäre vermutlich, einen Behavior zu schreiben, der einmal pro Frame aktiv wird (WakeupOnElapsedFrames(0)). In dessen processStimulus-Methode machst du dann genau das, was du bisher in enablePlanetCamera machst.

@mods 50 pfennig auf mein konto bitte ;)
Hier, bitte:
28635987_verysmall.gif
 
Zuletzt bearbeitet:

veritas696

Mitglied
hm, thx das werd ich mal ausprobieren wenns nicht gerade so viel Ressourcen fressen sollte. Aber wundert mich schon, daß da bisher noch keiner was zu weiß :rtfm:
 

Illuvatar

Top Contributor
Oh, Fehler meinerseits. Ich hab nochmal nachgeschaut - bei einer ViewingPlatform wird ALLOW_DETACH gesetzt. Das heißt, du kannst die viewingPlatform vom SimpleUniverse detachen und einfach irgendwo anders hinhängen.
 

veritas696

Mitglied
achso, das heißt ich könnte die ViewingPlatform einfach an meine Planeten hängen (quasi als Trabant) ? mal ausprobieren. Versuchs grad mit dem Behavior, aber da bewegt sich meien Kamera auch noch nicht. Sie wechselt zwar anfangs zum Planeten aber läuft dann nich mehr mit *grübbel*
 

veritas696

Mitglied
so bin jetzt schonmal ein Stück weiter. Ich habe mir also ein Behavior geschrieben welches bei jedem Frame aufgerufen wird. Die Klasse sieht so aus:


[highlight=Java]
public class PlanetLookBehavior extends Behavior
{
WakeupOnElapsedFrames FPSwakeup = new WakeupOnElapsedFrames(0);
private Planet currentPlanet;
private TransformGroup targetTG;

public PlanetLookBehavior(TransformGroup targetTG)
{
this.targetTG = targetTG;
}

public void initialize()
{
this.wakeupOn(FPSwakeup);
}

public void processStimulus(Enumeration criteria)
{
if(currentPlanet != null)
{
TransformGroup ViewTG = currentPlanet.getCenterRotTG();
Transform3D ViewT3D = new Transform3D();
ViewTG.getTransform(ViewT3D);

targetTG.setTransform(ViewT3D);
}
this.wakeupOn(FPSwakeup);

}

public void setCurrentPlanet(Planet currentP)
{
currentPlanet = currentP;
}

public void resetCurrentPlanet()
{
currentPlanet = null;
}
}
[/highlight]

Wenn ich das Programm also starte befindet sich meine Kamera (Ansicht) in der Mitte des Sonnensystems. Also an dem Punkt worum der Planet rotiert. Die Kamera verfolgt auch den Planeten in dem si mit ihm mitschwenkt(Kamera rotiert auf der Stelle).
Jetzt möchte ich aber mit der Kamera nicht in der Mitte des Sonnensystems stehen sondern hinter dem Planeten und möchte auf den Mittelpunkt des Sonnensystems schauen und mit dem Planeten mitfliegen.
Also Kamera Planet und Sonne sollen auf einer Achse liegen wobei die Kamera Richtung Sonne schaut. Zwischen Kamera und Sonne befindet sich der Planet.
wie muss ich da transformieren (wenn das reicht) um das hinzubekommen ?
 
Zuletzt bearbeitet:

Illuvatar

Top Contributor
Also, es gibt zwei Möglichkeiten.

Eine (die bessere), da musst du einfach nur die Kamera an deine "CamTG" hängen (+noch um 180° drehen wenn ich mich nicht irre) und fertig.

Nur für die andere brauchst du den Behavior. Da müsstest du jetzt in jedem Frame berechnen, wo die Kamera hinmuss, und dieses Transform3D der ViewingPlatform übergeben. Um das zu berechnen würdest du allerdings am sinvollsten das Transform3D per CamTG.getLocalToVWorld() abholen (+noch drehen).
 

veritas696

Mitglied
1. Möglichkeit: wenn ich Versuche meine targetTg als Child meiner CamTg hinzuzufügen, bekomm ich den Fehler das targetTG schon ein "parent" hat, is ja logisch aber wie kann ich den targetTG aushängen aus dem alten Node. Oder muss ich meine gesamte Kamera (BranchGroup) an mein CamTG hängen?

2. Möglichkeit:
Ich habs mit diesem LocaltoVworld() probiert:

[highlight=Java]
public void processStimulus(Enumeration criteria)
{
if(currentPlanet != null)
{
// aktuelle Transformation des Planeten holen
TransformGroup ViewTG = currentPlanet.getCamTG();
Transform3D ViewT3D = new Transform3D();

ViewTG.getLocalToVworld(ViewT3D);
//ViewTG.getTransform(ViewT3D);


targetTG.setTransform(ViewT3D);

}
this.wakeupOn(FPSwakeup);

}
[/highlight]

aber das sieht noch genauso aus wie vorher :oops:

ach man, das kann doch nicht so schwer sein ???:L
 

Illuvatar

Top Contributor
Was ist denn targetTg? Falls das die ViewPlatform ist, kannst du einfach
[HIGHLIGHT="Java"]targetTg.detach();
[...].addChild(targetTg);[/HIGHLIGHT]
machen.
 

veritas696

Mitglied
Jo bald haben wirs geschafft :toll:

jetzt gibts noch eine Sache: Beim Start meines Programms kann ich mich erstmal frei bewegen mit der Kamera, erst wenn ich die Taste "3" drücke soll er in die "Planeteansicht"wechseln. Jetzt merke ich wenn ich mich vorher mit der freien Kamera bewege hat dies einfluß auf die spätere Position der KAmera in der Planetenansicht. Zum Beispiel: Fliege ich mit meiner freien Kamera etwas nach oben so bin ich auch in der Planetenansicht weiter oben hinter dem Planeten. Anscheinend sind die anderen Transformationen noch vorhanden, kann man die irgentwie löschen oder so. Ich meine die Kamera zurück zum Ursprung setzen - detachen - und dann an den Planeten hängen?

Edit: habs mit setNomialViewingTransform() probiert und es klappt :applaus:

Muss ich noch was beachten wenn ich zurück zur freien Kamera wechsele?
reicht da ein einfaches RootBG.addChild(viewingPlatform)?
 
Zuletzt bearbeitet:
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
N Java3d in Eclipse einbinden Spiele- und Multimedia-Programmierung 4
Neumi5694 Java3D Viewer Beschriftung Spiele- und Multimedia-Programmierung 1
C Java3D Transformieren von obj. Datein Spiele- und Multimedia-Programmierung 0
M Cylinder anhand eines Vektors ausrichten (Java3d) Spiele- und Multimedia-Programmierung 0
Ruvok Java3D Tutorial gesucht Spiele- und Multimedia-Programmierung 5
U Hilfe bei Implementierung eines PointSounds in Java3D Spiele- und Multimedia-Programmierung 1
R Java3d ViewingPlatform erst Verschieben und dann RotationsInterpolator Spiele- und Multimedia-Programmierung 0
D Java3D - Blickfeld Spiele- und Multimedia-Programmierung 1
P Java3D Box Dimensionen und Positionierung Spiele- und Multimedia-Programmierung 1
E Java3D Objekt skalieren per JSlider/JButton Spiele- und Multimedia-Programmierung 10
S Java3D: Primitives zu einem Objekt kombinieren Spiele- und Multimedia-Programmierung 7
J Java3D - Textur laden geht nicht Spiele- und Multimedia-Programmierung 9
J Java3D - Farben vermischen sich Spiele- und Multimedia-Programmierung 7
T Java3D Rendering Problem Spiele- und Multimedia-Programmierung 7
S Java3D oder JMonkey? Spiele- und Multimedia-Programmierung 17
H Java3D - Textur aufs innere einer Sphere mappen Spiele- und Multimedia-Programmierung 9
C java 3d ohne Java3d Spiele- und Multimedia-Programmierung 28
Maxim6394 [Java3D] Probleme bei Kollision Spiele- und Multimedia-Programmierung 7
Maxim6394 [Java3D] lookAt Mausposition Spiele- und Multimedia-Programmierung 17
Maxim6394 [Java3D] Probleme mit KeyFrame Animationen Spiele- und Multimedia-Programmierung 9
K Java3D als Applet ohne Installation von Java3d Spiele- und Multimedia-Programmierung 6
D Java3D Installation: package javax.media.j3d not found Spiele- und Multimedia-Programmierung 5
C Java3D Texture Mapping Spiele- und Multimedia-Programmierung 2
W Java3D: Kanten die hinter einem Objekt liegen werden gezeigt Spiele- und Multimedia-Programmierung 2
W Java3D: Farbe von Objekten stimmt nicht mit übergebenem RGB-Wert überein Spiele- und Multimedia-Programmierung 9
M Eigene Renderengine ohne Java3D,etc. Spiele- und Multimedia-Programmierung 19
C Java3D Sound spielt nur einen Sound ab. Spiele- und Multimedia-Programmierung 8
A JAVA3D TransformGroup <--> Group Problem Spiele- und Multimedia-Programmierung 3
M [Java3D] Animation von mehreren Objekten Spiele- und Multimedia-Programmierung 7
W Java3D: Eckkoordinaten einer Box herausfinden Spiele- und Multimedia-Programmierung 18
T Java3D: Objekte platzieren und entfernen? Spiele- und Multimedia-Programmierung 7
T Java3D: Nur die Kanten des Würfels rendern? Spiele- und Multimedia-Programmierung 4
W Java3D setBounds(BoundingBox) Spiele- und Multimedia-Programmierung 6
T [gelöst] Java3D: Unerwünschte Rotation um die 3.Achse vermeiden? Spiele- und Multimedia-Programmierung 3
Bastie JAVA3D - WRL Transform Spiele- und Multimedia-Programmierung 9
G Eclipse Problem mit Java3d Spiele- und Multimedia-Programmierung 3
T Java3D - Lichtquelle einbauen Spiele- und Multimedia-Programmierung 7
jemandzehage java3d parallel und perspective view Spiele- und Multimedia-Programmierung 5
H Cinema 4D in Java3D importieren Spiele- und Multimedia-Programmierung 2
1 [Java3D] komplexes Projekt? Spiele- und Multimedia-Programmierung 10
P .obj-Datei in Java3D laden: ParsingErrorException Spiele- und Multimedia-Programmierung 7
C Java3D Lichtquelle beim Beobachter Spiele- und Multimedia-Programmierung 2
C Java3D Interaktion während Animation Spiele- und Multimedia-Programmierung 3
aze Java3D: Flächen teilen Spiele- und Multimedia-Programmierung 15
P Java3D Textur verzerrt Spiele- und Multimedia-Programmierung 3
aze Java3D: Gegenstände aufeinander zubewegen ohne Kollision Spiele- und Multimedia-Programmierung 4
D [JAVA3D] Es werden 2 Fenster erzeugt und auf dem falschen gezeichnet Spiele- und Multimedia-Programmierung 3
aze Java3D: leere Räume füllen Spiele- und Multimedia-Programmierung 2
aze Java3d:Helligkeit von Shape3D ändern Spiele- und Multimedia-Programmierung 2
S Einschätzung zu Java3D-Einstieg Spiele- und Multimedia-Programmierung 3
F Programm mit Java3D unter Linux laufen lassen Spiele- und Multimedia-Programmierung 3
I Vergleich von Java3D und OpenGL Spiele- und Multimedia-Programmierung 17
W Waterslide mit Java3D Spiele- und Multimedia-Programmierung 11
M Java3D Picking - falsche Objekte werden gepickt Spiele- und Multimedia-Programmierung 3
M [Java3D] Rotieren der Scene NICHT des POV Spiele- und Multimedia-Programmierung 4
F Jogl oder Java3D ? Spiele- und Multimedia-Programmierung 20
K Java3D Abfängerfrage Spiele- und Multimedia-Programmierung 3
aze Java3D:Farbige Flächen verschwinden lassen(Transparenz- oder Colorinterpolator?)) Spiele- und Multimedia-Programmierung 5
C Java3D PositionInterpolator Spiele- und Multimedia-Programmierung 3
G [Java3D] Probleme bei Animation Spiele- und Multimedia-Programmierung 4
E [JAVA3D] Kamerasteuerung Spiele- und Multimedia-Programmierung 3
E [JAVA3D] Schattenstrich durch die Szene Spiele- und Multimedia-Programmierung 4
M Grundsätzliche Java3D Fragen Spiele- und Multimedia-Programmierung 2
C Java3D SceneGraohPath Spiele- und Multimedia-Programmierung 2
C Java3D Rotation um einen Punkt (y-achse) Spiele- und Multimedia-Programmierung 2
G Java3D plattformunabhängig bundeln Spiele- und Multimedia-Programmierung 3
TheKing Java3D-Shooter View Spiele- und Multimedia-Programmierung 2
A Java3D tutorial? Spiele- und Multimedia-Programmierung 3
R Java3D Kollisionserkennung und Schwerkraft Spiele- und Multimedia-Programmierung 17
M Java3D Objekte entfernen und hinzufügen Spiele- und Multimedia-Programmierung 10
J Java3d Schnelle Geschosse Spiele- und Multimedia-Programmierung 12
D Kann ich mit Java3D 2D Daten als 3D surfaceplot plotten? Spiele- und Multimedia-Programmierung 5
J Java3d setTextureTransform verändert J3DGraphics2D Spiele- und Multimedia-Programmierung 4
J Hilfe: Rotation X und Y Achse (Java3d) Spiele- und Multimedia-Programmierung 12
K Java3D: LineStripArray Spiele- und Multimedia-Programmierung 2
P Java3D - Zylinder genau wie Vektor ausrichten Spiele- und Multimedia-Programmierung 5
Developer_X Java3D Mensch Ärgere Dich nicht. Spiele- und Multimedia-Programmierung 10
C JAVA3D Rotation um einen bestimmten Punkt Spiele- und Multimedia-Programmierung 20
Developer_X Java3D-Ungeeignet für 3D Spiele wegen Heap Space=? Spiele- und Multimedia-Programmierung 23
Developer_X Java3D Canvas post Renderer und? Spiele- und Multimedia-Programmierung 5
A Java3D Sichtweite Spiele- und Multimedia-Programmierung 2
"Er" Kamera rotation in Java3D Spiele- und Multimedia-Programmierung 2
A Java3D: Behavior scheduling bounds Spiele- und Multimedia-Programmierung 3
Developer_X THE BALL (needs Java3D) Spiele- und Multimedia-Programmierung 34
Developer_X Java3D Game_(die erste) Spiele- und Multimedia-Programmierung 2
Developer_X Java3D und while schleifen Spiele- und Multimedia-Programmierung 4
Developer_X Collisionserkennung in Java3D Spiele- und Multimedia-Programmierung 3
Developer_X Java3D Node -> Obj Data Spiele- und Multimedia-Programmierung 2
Developer_X Figuren werden nicht angezeigt (Java3D) Spiele- und Multimedia-Programmierung 5
S PDFRenderer und Java3D Spiele- und Multimedia-Programmierung 2
Developer_X Java3D- der Mausklick auf Nodes Spiele- und Multimedia-Programmierung 3
Developer_X Java3D Point Sound Spiele- und Multimedia-Programmierung 71
Developer_X Lines in Java3D Spiele- und Multimedia-Programmierung 4
V Java3D: HUD erstellen Spiele- und Multimedia-Programmierung 2
V Java3D: scheinende Sonne Spiele- und Multimedia-Programmierung 4
V Java3D: Ringe für Saturn erstellen Spiele- und Multimedia-Programmierung 8
V Java3D: mehrere ViewingPlaforms in Sonnensystem Spiele- und Multimedia-Programmierung 8
Developer_X Thread in Java3D Spiele- und Multimedia-Programmierung 8
B Java3D .obj dateien Spiele- und Multimedia-Programmierung 2
Developer_X Java3D's next TopModel Spiele- und Multimedia-Programmierung 16

Ähnliche Java Themen

Neue Themen


Oben