Hi,
ich habe schon wieder ein Problem mit der Rotation in j3d. In einem anderen Threat wurde mir bereits dabei geholfen ein Objekt vernünftig zu rotieren. Jetzt habe ich ein 2. Objekte erzeugt und wollte es auf die selbe Weise drehen lassen. Das funktioniert aber nicht, die beiden Rotationen überschreiben sich und es kommt zu mysteriösen Ereignissen
Hier mal fix die Klasse, die sich um die Bewegung kümmert (auf das Wichtigste reduziert)
Die beiden zu bewegenden Objekte sind Flugzeug und Enemy. Eigentlich müssten beide Ihre eigenen Bewegungen ausführen können, ohne sich zu beeinflussen (es gibt ja trans und transE, sowie currentRotation und currentRotationE). Solange siche Enemy nicht dreht klappt das auch, aber sobald rotateE() aufgerufen wird lässt sich Flugzeug nicht mehr vernünftig steuern.
Ich hoffe jemand von euch sieht warum das so ist.
Wie immer vielen Dank im Vorraus...
ich habe schon wieder ein Problem mit der Rotation in j3d. In einem anderen Threat wurde mir bereits dabei geholfen ein Objekt vernünftig zu rotieren. Jetzt habe ich ein 2. Objekte erzeugt und wollte es auf die selbe Weise drehen lassen. Das funktioniert aber nicht, die beiden Rotationen überschreiben sich und es kommt zu mysteriösen Ereignissen
Hier mal fix die Klasse, die sich um die Bewegung kümmert (auf das Wichtigste reduziert)
Java:
class Steuerung implements KeyListener
{
private final TransformGroup myTransformGroup;
private final Flugzeug myFlugzeug;
private final Enemy theEnemy;
private Transform3D trans = new Transform3D();
private Transform3D transE = new Transform3D();
private final Spiel parent;
private int enemyTurn=0;
float xE = 0f;
float yE = 0f;
private final int upKey = KeyEvent.VK_W;
private final int downKey = KeyEvent.VK_S;
private final int leftKey = KeyEvent.VK_A;
private final int rightKey = KeyEvent.VK_D;
private final int speedUp = KeyEvent.VK_UP;
private final int slowDown = KeyEvent.VK_DOWN;
private final Thread thread;
private float speed = 0f;
private final Set<Integer> pressedKeys = new HashSet<Integer>();
private Matrix4f currentRotation = new Matrix4f();
private Matrix4f currentRotationE = new Matrix4f();
public Steuerung(TransformGroup rotatedTransformGroup, Flugzeug flugzeug, Spiel spiel, Enemy enemy)
{
this.myTransformGroup = rotatedTransformGroup;
this.myFlugzeug = flugzeug;
this.parent = spiel;
this.theEnemy = enemy;
currentRotation.setIdentity();
currentRotationE.setIdentity();
thread = new Thread(new Runnable() {
@Override
public void run() {
while (true) {
updateMovement();
try {
Thread.sleep(10);
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
}
}
}
});
thread.setDaemon(true);
thread.start();
}
private void updateMovement() {
if (pressedKeys.contains(upKey)&& !pressedKeys.contains(downKey)){
rotate(-0.1f, 0);
}
if (pressedKeys.contains(downKey)&& !pressedKeys.contains(upKey)){
rotate(0.1f, 0);
}
if (pressedKeys.contains(leftKey)&& !pressedKeys.contains(rightKey)){
rotate(0, 0.1f);
}
if (pressedKeys.contains(rightKey) && !pressedKeys.contains(leftKey)) {
rotate(0, -0.1f);
}
if (pressedKeys.contains(slowDown) && !pressedKeys.contains(speedUp) && speed>=-0.05f) {
speed-=0.001f;
}
if (pressedKeys.contains(speedUp) && !pressedKeys.contains(slowDown)&& speed<=0.15f) {
speed+=0.001f;
}
move();
moveEnemy();
}
private void moveEnemy() {
if(enemyTurn==50){
xE = (float)Math.random()*(0.3f+0.3f)-0.3f;
yE = (float)Math.random()*(0.3f+0.3f)-0.3f;
rotateE(xE, yE);
}
else if (enemyTurn <90 && enemyTurn>50){
rotateE(xE, yE);
}
else if (enemyTurn==90) enemyTurn=0;
else enemyTurn++;
Transform3D tempTransform1 = new Transform3D();
Vector3f tempVector1 = new Vector3f();
theEnemy.getSphere().getLocalToVworld(tempTransform1);
tempTransform1.get(tempVector1);
Transform3D tempTransform2 = new Transform3D();
Vector3f tempVector2 = new Vector3f();
theEnemy.getSphere2().getLocalToVworld(tempTransform2);
tempTransform2.get(tempVector2);
tempVector1.x += (tempVector1.x-tempVector2.x) * 0.13f;
tempVector1.y += (tempVector1.y-tempVector2.y) * 0.13f;
tempVector1.z += (tempVector1.z-tempVector2.z) * 0.13f;
transE.setTranslation(tempVector1);
transE.setAutoNormalize(true);
theEnemy.setTransform(transE );
}
private void rotateE(float angleX, float angleY) {
Matrix4f m0 = new Matrix4f();
m0.setIdentity();
m0.rotX(angleX/4);
Matrix4f m1 = new Matrix4f();
m1.setIdentity();
m1.rotY(angleY/4);
Matrix4f result = new Matrix4f();
result.mul(m0, m1);
currentRotationE.mul(currentRotationE, result);
transE = new Transform3D(currentRotationE);
}
private void rotate(float angleX, float angleY) {
Matrix4f m0 = new Matrix4f();
m0.setIdentity();
m0.rotX(angleX/4);
Matrix4f m1 = new Matrix4f();
m1.setIdentity();
m1.rotY(angleY/4);
Matrix4f result = new Matrix4f();
result.mul(m0, m1);
currentRotation.mul(currentRotation, result);
trans = new Transform3D(currentRotation);
}
@Override
public void keyTyped(KeyEvent e){
}
@Override
public void keyPressed(KeyEvent e){
pressedKeys.add(e.getKeyCode());
}
@Override
public void keyReleased(KeyEvent e){
pressedKeys.remove(e.getKeyCode());
}
private void move(){
Transform3D tempTransform1 = new Transform3D();
Vector3f tempVector1 = new Vector3f();
myFlugzeug.getSphere().getLocalToVworld(tempTransform1);
tempTransform1.get(tempVector1);
Transform3D tempTransform2 = new Transform3D();
Vector3f tempVector2 = new Vector3f();
myFlugzeug.getSphere2().getLocalToVworld(tempTransform2);
tempTransform2.get(tempVector2);
tempVector1.x += (tempVector1.x-tempVector2.x) * speed;
tempVector1.y += (tempVector1.y-tempVector2.y) * speed;
tempVector1.z += (tempVector1.z-tempVector2.z) * speed;
trans.setTranslation(tempVector1);
trans.setAutoNormalize(true);
myTransformGroup.setTransform(trans);
}
}
Die beiden zu bewegenden Objekte sind Flugzeug und Enemy. Eigentlich müssten beide Ihre eigenen Bewegungen ausführen können, ohne sich zu beeinflussen (es gibt ja trans und transE, sowie currentRotation und currentRotationE). Solange siche Enemy nicht dreht klappt das auch, aber sobald rotateE() aufgerufen wird lässt sich Flugzeug nicht mehr vernünftig steuern.
Ich hoffe jemand von euch sieht warum das so ist.
Wie immer vielen Dank im Vorraus...