Hi,
ich habe meinem Tutorial gefolgt und mal eine einfach Animation in meinen SceneGraph eingebaut. Das ganze sieht so aus:
superGroup beinhaltet also alle Objekte (Box, Sphere, etc) und das ganze soll um die Y-Achse gedreht werden. Ich versteh schon wie das hier geht, also Timer triggert alle 60ms den ActionListener der das wieder weitergibt an handleTimer(). Nur was da abgeht check ich nicht so ganz.
Bis da hin komm ich mit, aber warum wird dann aus superTrans wieder die Rotation überschrieben??? Die wird ja wieder komplett zurückgesetzt bis auf das was neu angegeben wird. Warum kann nicht die alte Rotation beibehalten werden und nur die Y-Achse zurückgesetzt werden, oder die Rotation ausgelesen und dann neu gesetzt werden?
Und dieser Methode mul() aus Transform3D kapier ich nicht ganz:
Also müsste da ja immer 0 Grad stehen. Kann aber nicht sein, denn das Ding dreht sich ja
Also was ist da los?
mfg
jagdfalke
ich habe meinem Tutorial gefolgt und mal eine einfach Animation in meinen SceneGraph eingebaut. Das ganze sieht so aus:
Code:
public class Main extends JFrame implements ActionListener {
private SimpleUniverse un;
private Timer timer;
private float currAngle;
private TransformGroup superGroup;
private Transform3D superTrans;
public Main() {
setLayout(new BorderLayout());
setSize(500,500);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
GraphicsConfiguration config = SimpleUniverse.getPreferredConfiguration();
Canvas3D c=new Canvas3D(config);
getContentPane().add(c);
un = new SimpleUniverse(c);
un.getViewingPlatform().setNominalViewingTransform();
un.addBranchGraph(createSceneGraph());
currAngle = 0f;
timer = new Timer(60, this);
timer.start();
setVisible(true);
}
public void actionPerformed(ActionEvent e) {
if(e.getSource().equals(timer)) {
handleTimer();
}
}
private void handleTimer() {
Transform3D tempT3D=new Transform3D();
currAngle+=1f;
if (currAngle>=360) {
currAngle-=360;
}
superTrans.setRotation(new AxisAngle4f(1f,0f,0f,(float)Math.toRadians(20)));
tempT3D.rotY(Math.toRadians(currAngle));
superTrans.mul(tempT3D);
superGroup.setTransform(superTrans);
}
private BranchGroup createSceneGraph() {
BranchGroup bg = new BranchGroup();
// ...
// das lass ich mal alles weg
// aus Gründen der Übersichtlichkeit
// ...
bg.addChild(superGroup);
bg.compile();
return bg;
}
public static void main(String[] args) {
new Main();
}
}
superGroup beinhaltet also alle Objekte (Box, Sphere, etc) und das ganze soll um die Y-Achse gedreht werden. Ich versteh schon wie das hier geht, also Timer triggert alle 60ms den ActionListener der das wieder weitergibt an handleTimer(). Nur was da abgeht check ich nicht so ganz.
Code:
Transform3D tempT3D=new Transform3D();
currAngle+=1f;
if (currAngle>=360) {
currAngle-=360;
}
Und dieser Methode mul() aus Transform3D kapier ich nicht ganz:
Macht der this = this * t1 für alle Werte oder wie kann ich mir das vorstellen??? Wenn das so ist das müsse das ja so aussehen:Sets the value of this transform to the result of multiplying itself with transform t1 (this = this * t1).
Code:
private void handleTimer() {
Transform3D tempT3D=new Transform3D();
currAngle+=1f;
if (currAngle>=360) {
currAngle-=360;
}
superTrans.setRotation(new AxisAngle4f(1f,0f,0f,(float)Math.toRadians(20))); //x-Rot=20; y-Rot=0; z-Rot=0
tempT3D.rotY(Math.toRadians(currAngle)); // y-Rot-tmp = z.B. 20
superTrans.mul(tempT3D); ///y-Rot * y-Rot-tmp = 0 * 20 = 0 ????
superGroup.setTransform(superTrans);
}
mfg
jagdfalke