Main Menu

Skalieren

Started by kekrops, September 20, 2007, 12:06:53 AM

Previous topic - Next topic

kekrops

Hallo,

bisher hatte ich keine Probleme mit dem Skalieren von Objekten. Nur leider hab ich jetzt eine Situation, da verändert sich nach dem skalieren nicht das Objekt, sondern die Texture. Es sieht so aus als ob nur die Texture skaliert wird. Ich finde aber nirgendwo einen Fehler. Hat da jmd. evtl. eine Lösung oder einen Hinweis wonach ich schauen könnte?

EgonOlsen

Kann eigentlich nicht sein. Hast du mal einen Screenshot (am besten vor und nach dem Skalieren)?

kekrops

Quote from: EgonOlsen on September 20, 2007, 08:35:08 AM
Kann eigentlich nicht sein. Hast du mal einen Screenshot (am besten vor und nach dem Skalieren)?

Habe mal ein kleines Flash-Video gemacht.
http://www.is-md.de/jpct.swf

EgonOlsen

Das Ding ist environment mapped, oder? Hast du unter Umständen irgendwelchen Code drin, der die Kamera immer so setzt, dass das Objekt füllend erscheint? Ansonsten bräuchte ich mal einen Codeschnippsel oder die ganze Geschichte, um mir das anzusehen.
Kannst du es vielleicht auch mal mit einer deutlicheren Textur probieren? Die aktuelle ist so undifferenzierbar, dass ich nicht wirklich erkennen kann, was da passiert.

kekrops

So ich weiss jetzt woran es liegt. Ich versteh es nur nicht und beheben kann ich es auch nicht. Hier mal die Fehlerquelle:
Ich habe eine Methode doTransformation, die eine Transformation auf einem Objekt ausführt:

public void doTransformation(Matrix matrix) {

this.checkForCollisionEllipsoid(matrix.getTranslation(), new SimpleVector(100, 100, 100), 1);

float[] f = matrix.getDump();
f[12] = f[13] = f[14] = 0;
Matrix rotMatrix = new Matrix();
rotMatrix.setDump(f);
Matrix transMatrix = new Matrix();
transMatrix.translate(matrix.getTranslation());

        setRotationMatrix(rotMatrix);
setTranslationMatrix(transMatrix);
}

Die Matrix die ich übergebe hat z.B. folgendes Aussehen:
(
   0.89446574   0.44598848   0.03202131   0.0
   0.44640648   -0.8948031   -0.006977995   0.0
   0.025540663   0.020536099   -0.99946284   0.0
   3.3978431   17.534836   460.37787   1.0
)

daraus generiere ich mir dann 2 Matrizen (je eine für die rotation und die translation):
(
   0.89446574   0.44598848   0.03202131   0.0
   0.44640648   -0.8948031   -0.006977995   0.0
   0.025540663   0.020536099   -0.99946284   0.0
   0.0   0.0   0.0   1.0
)
(
   1.0   0.0   0.0   0.0
   0.0   1.0   0.0   0.0
   0.0   0.0   1.0   0.0
   3.3978431   17.534836   460.37787   1.0
)

kommentiere ich bei der Methode die zeile setRotationMatrix(rotMatrix); aus, klappt es mit dem skalieren ohne Probleme. Sobald ich aber die Rotation hinzufüge, klappt es nicht mehr mit dem skalieren. Daher muss der Fehler wohl bei der rotation liegen.

EgonOlsen

Ah, ich verstehe. Das Geheimnis liegt im expliziten Setzen der Rotationsmatrix. Deswegen steht in den Docs zu setRotationMatrix() auch:

...make sure to reset the scale by calling setScale(1f) is you previously modified it.

Die Skalierung wird bei jPCT direkt auf die Matrix angewendet. Wenn du sie nachträglich umsetzt, verlierst du die Information in der Matrix, aber jPCT hält das Objekt intern für noch skaliert. Deswegen ändert sich die Größe nicht, aber die Texturen sitzen anderes. Also einfach vorher das alte Scaling holen und merken, auf 1 setzen, Matrix setzen, Scaling neu setzen. Dann passt das. Du darfst dann nur nicht mehr mit der gesetzten Matrix arbeiten als wäre sie noch die, die du reingegeben hast, denn das ist dann nicht mehr der Fall.

kekrops

Ahh ich verstehe. Habe grad gesehn es gibt neben der scale funktion noch eine setScale. Was ist der unterschied zwischen den beiden?

EgonOlsen

setScale ist absolut, d.h. wenn du setScale(2) sagst, ist das Objekt doppelt so groß. Machst du danach ein setScale(1), ist es wieder normal. Bei scale() wäre es weiterhin doppelt so groß, weil es relativ zum vorherigen arbeitet, d.h. 2*1=2. Um wieder auf normale Größe zu kommen, müsste man folglich ein scale(0.5f) machen.
Ich empfehle setScale() zu benutzen. scale() ist älter und nur in Ausnahmefällen sinnvoller.

kekrops

Quote from: EgonOlsen on September 20, 2007, 10:54:34 PM
setScale ist absolut, d.h. wenn du setScale(2) sagst, ist das Objekt doppelt so groß. Machst du danach ein setScale(1), ist es wieder normal. Bei scale() wäre es weiterhin doppelt so groß, weil es relativ zum vorherigen arbeitet, d.h. 2*1=2. Um wieder auf normale Größe zu kommen, müsste man folglich ein scale(0.5f) machen.
Ich empfehle setScale() zu benutzen. scale() ist älter und nur in Ausnahmefällen sinnvoller.

Alles klar....danke für die Hilfe.