[gelöst] Java3D: Unerwünschte Rotation um die 3.Achse vermeiden?

thewulf00

Bekanntes Mitglied
Hallo,

ich rotiere die View um die X- und die Y-Achse gleichzeitig (per Mauseingaben). Aber während das passiert, verändert sich auch die Z-Rotation. Das ist aber nicht erwünscht, wie kann ich das unterdrücken?

Ich habe zweierlei Vorgehen versucht, aber der Teufel steckt wohl in der Mathematik:
[Java=191]currXform.setRotation(new AxisAngle4f(1f, y_angle/x_angle, 0f, x_angle));[/Java]

[Java=191]transformX.rotX(x_angle);
transformY.rotY(y_angle);
currXform.mul(currXform, transformY);
currXform.mul(currXform, transformX);[/Java]

Die Rotation um nur eine Achse funktioniert tadellos, aber sobald ich um beide rotiere, wirkt sich das auf die Z-Achsenrotation aus. Hat jemand eine Idee, wie ich diese Z-Achsenrotation wegrechnen/beseitigen kann?

Hier ein Bild zur Verdeutlichung:
uploadp.png

Links ist das Rotieren der View um nur eine einzelne Achse dargestellt.
Rechts die Kombination beider Achsen. Die grünen Striche geben den Ursprung und die Rotationsrichtung an. Das gelbe Viereck zeigt an, in welcher Z-Rotation ich den roten Würfel eigentlich erwartet habe.
 
Zuletzt bearbeitet:

Marco13

Top Contributor
Hm. Ja. Viel mehr als "so ist das halt" kann man da kaum sagen. Dummerweise macht er halt immer nur die Rotation, die man Programmiert hat. Schon ein Ändern der Reihenfolge, in der die Multiplikationen durchgeführt werden, würde ja ein anderes Ergebnis liefern.

Spontan-Intuitiv aus dem Bauch heraus würde ich sagen, dass man um eine Achse rotieren muss, die Senkrecht auf der Bewegungsrichtung der Maus steht - und den passenden Winkel auszurechnen könnte dann nochmal ein bißchen komplizierter werden. Kannst du ein KSKB posten, so dass man schnell an einer Stelle mögliche Ansätze ausprobieren kann?
 

ChrisKu

Bekanntes Mitglied
ich rotiere die View um die X- und die Y-Achse gleichzeitig (per Mauseingaben). Aber während das passiert, verändert sich auch die Z-Rotation. Das ist aber nicht erwünscht, wie kann ich das unterdrücken?

Also, streng genommen rotiert Dein Würfel um die X-Achse und die Y-Achse und nicht um die Z-Achse. Und zwar rotiert er um die EIGENE x-Achse und y-Achse und NICHT um die x und y Achsen der virtuellen Welt. Beispiel: Wenn Du den Würfel 45 Grad um die x-Achse drehst, dann kippt damit auch die y-Achse des Würfels (die ursprünglich senkrecht nach oben zeigte) um 45 Grad nach vorne. Wenn Du den Würfel jetzt um 45 Grad um die y-Achse rotierst, dreht sich der Würfel um die geneigte y - Achse usw. So entsteht die Rotation um die z-Achse der virtuellen Welt. (Ganz deutlich: Wenn Du den Würfel erst um 90 Grad um die y-Achse drehst und dann um seine x-Achse entsteht eine Rotation um die z-Achse der virtuellen Welt).

Du kannst das ganze natürlich zurückrechnen in das Koordinatensystem der virtuellen Welt. Einen Link hierzu:

Transform3D (Java 3D API)

Aber vielleicht ist das auch gar nicht erforderlich, je nachdem, was Du vorhast. Statt die Rotationen aufeinander aufzubauen (die Transformationen zu multiplizieren, Zeile 193 und 194 Deines Codes) kannst Du die Rotation auch jedes Mal ganz neu setzen (und damit bezieht sich Deine Rotation immer auf die ursprüngliche Position). Dieses kann zumindest dann eine Lösung sein, wenn Deine Rotationsänderung jeweils in festen Schritten erfolgt. Ich habe das einmal an einem kleinen Testprogramm implementiert, wo die Rotation allerdings mit 4 Buttons gesteuert wird (2 für die beiden Richtungen der x-Achse und 2 für die beiden Richtungen der y-Achse). Mit jedem Click wird dabei die Anzahl der Roationsschritte um die jeweilige Achse inkremendiert bzw. dekrementiert um dann die komplette Rotation zu setzen. Hier das Code Fragment, bei dem ein Würfel in 45 Grad Schritten gedreht wird:

Code:
public void actionPerformed(ActionEvent e) {
        if (e.getSource() == exitButton) {
            dispose();
            System.exit(0);
        } else if (e.getSource() == this.lRotXButton){
            this.rotX ++;
        } else if (e.getSource() == this.rRotXButton){
            this.rotX --;

        } else if (e.getSource() == this.lRotYButton){
            this.rotY ++;
        } else if (e.getSource() == this.rRotYButton){
            this.rotY --;
        }
        Transform3D t3d = new Transform3D();
        Transform3D t3d2 = new Transform3D();
        t3d.rotX(rotX * Math.PI / 4.0);
        t3d2.rotY(rotY * Math.PI / 4.0);
        t3d.mul(t3d2);
        rotGroup.setTransform(t3d);
    }


Dieses Verhalten entspricht dann dem Verhalten, das Du vermutlich erwartest.
 

thewulf00

Bekanntes Mitglied
Vielen Dank euch beiden!

Ihr habt mir sehr geholfen. Ich habe beim Aufstellen des KSKBs per Timer das Verhalten einfach nicht reproduzieren können, weil ich instinkiv absolute Rotationen genutzt habe, genau wie ChrisKu das deutlich macht.
Ich habe jetzt mein Problemprogramm mit der Maussteuerung von relativer zu absoluter Drehung umgebaut. Anfangs (im processStimulus) wird einfach ein transform.setIdentity() gemacht und dann die gesamte Rotation jeder Achse ausgeführt.

Die Erklärung von ChrisKu ist genau zutreffend auf mein Problem: Ich habe immer (mit jeder Mausbewegung) einen kleinen, relativen Anteil hinzugerechnet - d.h. zusammengefasst wurde der Würfel 100er Male um verschiedene, relative Achsen gedreht.

Vielen Dank - Mein Verständnis ist nun verbessert worden.
Das funktionierende KSKB poste ich dennoch:

KSKB_RotZ.java
[Java]package kskb_rotz;

import com.sun.j3d.utils.geometry.*;
import com.sun.j3d.utils.universe.*;

import java.awt.event.*;

import javax.media.j3d.*;
import javax.vecmath.*;

public class KSKB_RotZ
{
protected Transform3D transformX = new Transform3D();
protected Transform3D transformY = new Transform3D();
private Transform3D result = new Transform3D();
private float x_angle = 0f,
y_angle = 0f;
private float x_factor = 0.1f,
y_factor = 0.1f;
private TransformGroup objTrans;

public KSKB_RotZ()
{
SimpleUniverse universe = new SimpleUniverse();
BranchGroup scene = createSceneGraph(universe);

universe.getViewingPlatform().setNominalViewingTransform();
universe.addBranchGraph(scene);
}

private BranchGroup createSceneGraph(SimpleUniverse su)
{
objTrans = su.getViewingPlatform().getViewPlatformTransform();

BranchGroup objRoot = new BranchGroup();
TransformGroup boxContainer = new TransformGroup();
ColorCube box = new ColorCube();
Transform3D boxPosition = new Transform3D();

boxPosition.setTranslation(new Vector3f(0.0f, 0.0f, -30.0f));
boxContainer.addChild(box);
boxContainer.setTransform(boxPosition);
objRoot.addChild(boxContainer);

BoundingSphere mouseBounds = new BoundingSphere(new Point3d(), 1000.0);
MouseNavigator myNavigator = new MouseNavigator(objTrans);

myNavigator.setSchedulingBounds(mouseBounds);
objRoot.addChild(myNavigator);

return objRoot;
}

public static void main(String[] args)
{
new KSKB_RotZ();
}
}[/Java]


MouseNavigator.java
[Java]package kskb_rotz;

import java.awt.*;
import java.awt.event.*;

import java.util.*;

import javax.media.j3d.*;

public class MouseNavigator extends Behavior implements MouseListener, MouseMotionListener
{
protected boolean reset = false;
protected boolean enable = true;
double x_factor = .01;
double y_factor = .01;
protected Transform3D currXform;
protected WakeupOr mouseCriterion;
protected WakeupCriterion[] mouseEvents;

protected TransformGroup transformGroup;
protected Transform3D transformX;
protected Transform3D transformY;

protected int x, y;
double x_angle, y_angle;
protected int x_last, y_last;

public MouseNavigator(TransformGroup transformGroup)
{
super();

this.transformGroup = transformGroup;
currXform = new Transform3D();
transformX = new Transform3D();
transformY = new Transform3D();
reset = true;
}

public TransformGroup getTransformGroup()
{
return this.transformGroup;
}

public void initialize()
{
mouseEvents = new WakeupCriterion[3];

mouseEvents[0] = new WakeupOnAWTEvent(MouseEvent.MOUSE_MOVED);
mouseEvents[1] = new WakeupOnAWTEvent(MouseEvent.MOUSE_PRESSED);
mouseEvents[2] = new WakeupOnAWTEvent(MouseEvent.MOUSE_RELEASED);

mouseCriterion = new WakeupOr(mouseEvents);
wakeupOn(mouseCriterion);

x = 0;
y = 0;
x_last = 0;
y_last = 0;
x_angle = 0;
y_angle = 0;

x_factor *= -1;
y_factor *= -1;
}

public void processStimulus(Enumeration criteria)
{
WakeupCriterion wakeup;
AWTEvent[] events;
MouseEvent evt;

while (criteria.hasMoreElements())
{
wakeup = (WakeupCriterion) criteria.nextElement();
events = ((WakeupOnAWTEvent) wakeup).getAWTEvent();

if (events.length > 0)
{
evt = (MouseEvent) events[events.length - 1];
doProcess(evt);
}
}

wakeupOn(mouseCriterion);
}

void doProcess(MouseEvent evt)
{
int id;
int dx, dy;

id = evt.getID();

if (id == MouseEvent.MOUSE_MOVED)
{
x = evt.getX();
y = evt.getY();
dx = x - x_last;
dy = y - y_last;

if (!reset)
{
x_angle += dy * y_factor;
y_angle += dx * x_factor;

currXform.setIdentity();

transformY.rotY(y_angle);
transformX.rotX(x_angle);

currXform.mul(transformY);
currXform.mul(transformX);

transformGroup.setTransform(currXform);
}else{
reset = false;
}

x_last = x;
y_last = y;
}
}

public void mouseClicked(MouseEvent e) {}
public void mousePressed(MouseEvent e) {}
public void mouseReleased(MouseEvent e) {}
public void mouseEntered(MouseEvent e) {}
public void mouseExited(MouseEvent e) {}
public void mouseDragged(MouseEvent e) {}
public void mouseMoved(MouseEvent e) {}
}[/Java]
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
C [gelöst] MP3-Codec-Problem Spiele- und Multimedia-Programmierung 2
G [Gelöst] Math.atan(.) gibt falsches Ergebnis Spiele- und Multimedia-Programmierung 7
A gelöst! Spiele- und Multimedia-Programmierung 12
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
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: automatisches Bewegen der Kamera Spiele- und Multimedia-Programmierung 19
V Java3D: mehrere ViewingPlaforms in Sonnensystem Spiele- und Multimedia-Programmierung 8

Ähnliche Java Themen

Neue Themen


Oben