General > German corner

Berechnung Rotation

<< < (3/3)

Telix:
Das ist leider nicht mein Problem :(
Ich hab mir mal die Zahlen genau angeschaut und an sich ist der Weg schon der richtige.

Siehe Tabelle:
https://docs.google.com/spreadsheet/ccc?key=0Am6BJ5tHhzH_dFYwek9Ba215Z183NlFtYnJ3eDVMalE&usp=sharing

Frage ist, warum der Wert so klein ist und ich diesen mit 35 mal nehmen muss?
Und warum erhalte ich bei nach Oben und Unten schauen beides eine 0?

Somit kann ich nicht entscheiden ob er nach oben oder unten schauen muss :(

Danke!!

EgonOlsen:
Nee, das ist nicht der richtige Weg. Es ist mir vorhin nicht aufgefallen, aber du mischt da die 3D-Räume zusammen. Das Rotation-Pivot ist im Objektraum, dein Blickpunkt im liegt aber in der Welt. Und der Vektor des Endpunktes ist auch niemals der UP-Vektor. Und es ist auch nicht genau das, was ich meinte....aber egal. Wenn du das so machen willst, dann musst du eher:


* Richtungsvektor r zum lookAt-Punkte berechnen (endVector-getTransformedCenter())
* Davon die Rotationsmatrix m bestimmen: r.getRotationMatrix(up); up ist dabei in deinem Fall wohl immer (0,-1,0)
* float angle=deriveAngle(m);
* Aktuelle Rotation mit clearRotation() löschen, mit angle um y-Achse rotieren
...irgendwie so...

Telix:
Also das mit der 35 ist nun weg und ich bekomme direkt den Wert zum drehen.
Jedoch nur für links und rechts :( Bei Oben und Unten bekomme ich immer 0.

startVector = 6,0,6
endvector = 6,0,7

oder

endVector = 6,0,5


--- Code: --- public void lookAt(SimpleCord pos) {
SimpleVector startVector = this.getTranslation();
SimpleVector endVector = new SimpleVector(pos.X * 2, startVector.y, pos.Y * 2);

SimpleVector diffVector = endVector.calcSub(startVector);
Matrix mat = diffVector.getRotationMatrix(new SimpleVector(0, -1, 0));

Log.w("STARTVECTOR", startVector.toString());
Log.w("ENDVECTOR", endVector.toString());

float angle = (float) deriveAngle(mat);
clearRotation();
rotateY(angle + (float)(0.5f * Math.PI));
Log.w("ANGLE", Float.toString(angle));
}


public float deriveAngle(Matrix mat) {
// float y = (float) Math.asin(Math.min(1f, Math.max(-1f, -mat.get(0, 2))));
float y = (float) Math.asin(-mat.get(0, 2));
return y;
}

--- End code ---

EgonOlsen:
Logisch, weil der Arkussinus keine Werte außerhalb von +-Pi/2 liefern kann. Deswegen war da ja mal der zusätzliche Code in der Methode, denn du rausgeworfen hast. Damit sollte erkannt werden, ob die Blickrichtung zwischen 180 und 270 Grad liegt und entsprechend PI addiert. Was ist denn, wenn du die Methode wieder so verwendest, wie sie mal war?

Telix:
arg -.- das is mir nun aber peinlich :(

ich hab das rausgenommen, da ich dachte ich verändere die Z Achse garnicht.
Sorry :( nun gehts...

Navigation

[0] Message Index

[*] Previous page

Go to full version