Rotation anhand des Bodens

Started by Socke, January 02, 2013, 01:19:07 PM

Previous topic - Next topic

Socke

Hallo,
ich will sowas wie im Car Demo erstellen. Es soll ein Auto anhand des Untergrundes die Neigung anpassen. Da der Untergrund aus unterschiedlichen Objekten besteht kann ich nicht genau das Gleiche machen wie in dem Demo. Soweit so gut habe ich es auch hinbekommen. Leider "zittert" das Auto in manchen Neigungen und ich komme nicht drauf warum.

-Ich habe einen Würfel A der per // finally apply the gravity
SimpleVector t = new SimpleVector(0, .1f, 0);
t = mainPlayerHitboxSphere.checkForCollisionEllipsoid(t, ellipsoidMainKart, 1);
mainPlayerHitboxSphere.translate(t);

über den Untergrund fährt
-Da drauf als Child ist ein genauso großer Würfel B (der in pink) ohne Kollision.
-Ich habe auch noch vier Kugeln als Räder. Über diese berechne ich ähnlich dem Car Beispiel die Neigung. Hier der Code
private void rotateKartByWheels(){
SimpleVector t = new SimpleVector(0, .1f, 0);
t = mainPlayerKart.getRightFront().checkForCollisionEllipsoid(t, ellipsoidRightFront, 1);
t.x=0;
t.z=0;
System.out.println(t.y+"|");
mainPlayerKart.getRightFront().translate(t);

t = new SimpleVector(0, .1f, 0);
t = mainPlayerKart.getLeftFront().checkForCollisionEllipsoid(t, ellipsoidRightFront, 1);
t.x=0;
t.z=0;
mainPlayerKart.getLeftFront().translate(t);

t = new SimpleVector(0, .1f, 0);
t = mainPlayerKart.getRightRear().checkForCollisionEllipsoid(t, ellipsoidRightFront, 1);
t.x=0;
t.z=0;
mainPlayerKart.getRightRear().translate(t);

t = new SimpleVector(0, .1f, 0);
t = mainPlayerKart.getLeftRear().checkForCollisionEllipsoid(t, ellipsoidRightFront, 1);
t.x=0;
t.z=0;
mainPlayerKart.getLeftRear().translate(t);



float rightFrontHeight = mainPlayerKart.getRightFront().checkForCollisionEllipsoid(mainPlayerKart.getRightFront().getTranslation(), ellipsoidRightFront, 1).y;
float rightRearHeight = mainPlayerKart.getRightRear().checkForCollisionEllipsoid(mainPlayerKart.getRightRear().getTranslation(), ellipsoidRightFront, 1).y;
float leftFrontHeight = mainPlayerKart.getLeftFront().checkForCollisionEllipsoid(mainPlayerKart.getLeftFront().getTranslation(), ellipsoidRightFront, 1).y;
float leftRearHeight = mainPlayerKart.getLeftRear().checkForCollisionEllipsoid(mainPlayerKart.getLeftRear().getTranslation(), ellipsoidRightFront, 1).y;

if (rightFrontHeight != mainPlayerKart.getRightFront().getTranslation().y){
rightFrontHeight += mainPlayerKart.getRightFront().getTranslation().y;
}

if (leftFrontHeight != mainPlayerKart.getLeftFront().getTranslation().y)
leftFrontHeight += mainPlayerKart.getLeftFront().getTranslation().y;


if (rightRearHeight != mainPlayerKart.getRightRear().getTranslation().y)
rightRearHeight += mainPlayerKart.getRightRear().getTranslation().y;


if (leftRearHeight != mainPlayerKart.getLeftRear().getTranslation().y)
leftRearHeight += mainPlayerKart.getLeftRear().getTranslation().y;

double angleFront=rightFrontHeight-leftFrontHeight;
angleFront=Math.atan(angleFront);

double angleRear=rightRearHeight-leftRearHeight;
angleRear=Math.atan(angleRear);

float rotZ=(float) ((angleFront+angleRear)/2d)*(-1);

double angleLeft=leftFrontHeight-leftRearHeight;
angleLeft=Math.atan(angleLeft);

double angleRight=rightFrontHeight-rightRearHeight;
angleRight=Math.atan(angleRight);
float rotX=(float) ((angleLeft+angleRight)/2d);

// System.out.println(rotX+"|"+rotZ+"|");

mainPlayerKart.getMainPlayerRotationsCube().clearRotation();
mainPlayerKart.getMainPlayerRotationsCube().rotateX(rotX);
mainPlayerKart.getMainPlayerRotationsCube().rotateZ(rotZ);
}



Hier ein Video. Wie man sieht spring der pinke Würfel ab und zu etwas. Warum?

http://www.youtube.com/watch?v=SySTzIRMvbw

EgonOlsen

Schwer zu sagen. Ehrlich gesagt sehe ich dem Video jetzt auch keine dramatischen Ereignisse... ;) Du kannst mit der Rekursionstiefe, der Größe des Ellisoids und http://www.jpct.net/doc/com/threed/jpct/Config.html#collideEllipsoidThreshold rumspielen und schauen, ob das was ändert.

Socke

Naja beim drehen zuckt der ab und zu kurz zurück und dann wieder vor. Rekursionstiefe und die Größe des Ellisoids habe ich schon probiert. Den anderen Vorschlag probiere ich noch aus. Danke.

Gibts eine Möglichkeit ein Objekt an ein anders zu hängen wie mit dem .addChild aber ohne Drehung? Ich glaube das habe ich mal hier irgendwo gelesen. Bin aber nicht mehr sicher.

rushtone

du könntest deinem objekt einfach die translationsmatrix zuweisen.
dann wird es an die selbe stelle gesetzt, aber ohne rotation.

EgonOlsen

Ja, wobei ich eher


target.getTranslationMatrix().setTo(source.getTranslationMatrix());

machen würde, damit nicht beide Objekte dieselbe Matrixinstanz verwenden. Denn wenn man das vergisst, gibt es sonst lustige Nebeneffekte.

Socke

OK hab das "zucken" wegbekommen.

Andere Frage die sicher schnell beantwortet werden kann.

Wenn ich Objekte, die ich als Hitboxen benutze, auf .setVisibility(false); setze ist es dann egal wieviel Polygone die haben weil die dann eh nicht berechnet werden oder sollte man schon drauf achten (z. B. die Kugeln die ich als Räder zur Neigung genommen habe im Video) nicht zu viele Polygone zu benutzen?

EgonOlsen

Für die Performance ist das egal. Etwas Speicher verbrauchen die zusätzlichen Polygone halt. Ich würde schon probieren, die Anzahl auf das nötige Maß zu begrenzen, aber ohne das jetzt zu dogmatisch zu verfolgen. Ein paar Polygone extra sollten nicht weh tun.