Hallo zusammen,
ich habe derzeit ein etwas merkwürdiges Problem. Ich schreibe derzeit für meine Masterarbeit eine 3D Simulation eines Magnetfeldes in der sich eine Fläche befindet, die man in Größe und Winkel verändern soll. Das drehen und verändern hat auch super geklappt, nur jetzt habe ich den Code in eine eigene Klasse ausgelagert und nun klemmts. Ein kleiner Überblick. Die Hauptanwendung fügt das HomogeneousModel (extends JPanel) und das ControlPanel hinzu, beim verschieben der Slider, wird der Wert im HomogeneousModel geupdated und adjustTransform aufgerufen. Hier wird die neue Transformation berechnet udn der TransformGroup zugewiesen. Leider passiert da nichts. Die Transformationsmatrix ist richtig/verändert sich beim verschieben der Regler. Zuvor hatte ich halt alles in einer Klasse, da lief es. Jetzt leider nicht mehr.
Main
[JAVA=23]
public Magnetsimu() {
HomogeneousModel homogeneousModel = new HomogeneousModel();
model.magneticModel = new HomogeneousModel();
add(BorderLayout.CENTER, homogeneousModel);
model.control = new ControlPanel();
add(BorderLayout.EAST, model.control);
}
[/code]
Auszug aus ControlPanel.java
[JAVA=40]
angleSlider = new JSlider(0, 90);
angleSlider.setValue(0);
add(new Label("Winkel"));
add(angleSlider);
angleSlider.addChangeListener(new ChangeListener() {
@Override
public void stateChanged(ChangeEvent e) {
model.magneticModel.setAngle(angleSlider.getValue());
}
});
[/code]
HomogeneousModel createSceneGraph
[JAVA=112]
cyl3d = new Transform3D();
cyl = new Cylinder(0.5f, 0.02f, blueApp);
transCyl = new TransformGroup(cyl3d);
transCyl.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
transCyl.setCapabilityIsFrequent(TransformGroup.ALLOW_TRANSFORM_WRITE);
transCyl.addChild(cyl);
objRoot.addChild(transCyl);
[/code]
[JAVA=155]
@Override
public void setAngle(int angle) {
this.angle = angle;
adjustTransform();
}
@Override
public void setRadius(int radius) {
this.radius = radius;
adjustTransform();
}
private void adjustTransform()
{
cyl3d.rotZ(angle * (Math.PI / 180d));
cyl3d.setScale(new Vector3d(radius / 100d, 1d, radius / 100d));
Transform3D test = new Transform3D();
test.setTranslation(new Vector3d(5d, 1d, 1d));
transCyl.setTransform(test);
}
[/code]
ich habe derzeit ein etwas merkwürdiges Problem. Ich schreibe derzeit für meine Masterarbeit eine 3D Simulation eines Magnetfeldes in der sich eine Fläche befindet, die man in Größe und Winkel verändern soll. Das drehen und verändern hat auch super geklappt, nur jetzt habe ich den Code in eine eigene Klasse ausgelagert und nun klemmts. Ein kleiner Überblick. Die Hauptanwendung fügt das HomogeneousModel (extends JPanel) und das ControlPanel hinzu, beim verschieben der Slider, wird der Wert im HomogeneousModel geupdated und adjustTransform aufgerufen. Hier wird die neue Transformation berechnet udn der TransformGroup zugewiesen. Leider passiert da nichts. Die Transformationsmatrix ist richtig/verändert sich beim verschieben der Regler. Zuvor hatte ich halt alles in einer Klasse, da lief es. Jetzt leider nicht mehr.
Main
[JAVA=23]
public Magnetsimu() {
HomogeneousModel homogeneousModel = new HomogeneousModel();
model.magneticModel = new HomogeneousModel();
add(BorderLayout.CENTER, homogeneousModel);
model.control = new ControlPanel();
add(BorderLayout.EAST, model.control);
}
[/code]
Auszug aus ControlPanel.java
[JAVA=40]
angleSlider = new JSlider(0, 90);
angleSlider.setValue(0);
add(new Label("Winkel"));
add(angleSlider);
angleSlider.addChangeListener(new ChangeListener() {
@Override
public void stateChanged(ChangeEvent e) {
model.magneticModel.setAngle(angleSlider.getValue());
}
});
[/code]
HomogeneousModel createSceneGraph
[JAVA=112]
cyl3d = new Transform3D();
cyl = new Cylinder(0.5f, 0.02f, blueApp);
transCyl = new TransformGroup(cyl3d);
transCyl.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
transCyl.setCapabilityIsFrequent(TransformGroup.ALLOW_TRANSFORM_WRITE);
transCyl.addChild(cyl);
objRoot.addChild(transCyl);
[/code]
[JAVA=155]
@Override
public void setAngle(int angle) {
this.angle = angle;
adjustTransform();
}
@Override
public void setRadius(int radius) {
this.radius = radius;
adjustTransform();
}
private void adjustTransform()
{
cyl3d.rotZ(angle * (Math.PI / 180d));
cyl3d.setScale(new Vector3d(radius / 100d, 1d, radius / 100d));
Transform3D test = new Transform3D();
test.setTranslation(new Vector3d(5d, 1d, 1d));
transCyl.setTransform(test);
}
[/code]