Author Topic: Rotation anhand des Bodens  (Read 5851 times)

Offline Socke

  • byte
  • *
  • Posts: 17
    • View Profile
Rotation anhand des Bodens
« on: January 02, 2013, 01:19:07 pm »
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
Code: [Select]
// 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
Code: [Select]
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

Offline EgonOlsen

  • Administrator
  • quad
  • *****
  • Posts: 12298
    • View Profile
    • http://www.jpct.net
Re: Rotation anhand des Bodens
« Reply #1 on: January 02, 2013, 09:07:48 pm »
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.

Offline Socke

  • byte
  • *
  • Posts: 17
    • View Profile
Re: Rotation anhand des Bodens
« Reply #2 on: January 02, 2013, 10:52:48 pm »
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.

Offline rushtone

  • byte
  • *
  • Posts: 18
    • View Profile
Re: Rotation anhand des Bodens
« Reply #3 on: January 07, 2013, 08:11:16 pm »
du könntest deinem objekt einfach die translationsmatrix zuweisen.
dann wird es an die selbe stelle gesetzt, aber ohne rotation.

Offline EgonOlsen

  • Administrator
  • quad
  • *****
  • Posts: 12298
    • View Profile
    • http://www.jpct.net
Re: Rotation anhand des Bodens
« Reply #4 on: January 07, 2013, 08:35:10 pm »
Ja, wobei ich eher

Code: [Select]
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.

Offline Socke

  • byte
  • *
  • Posts: 17
    • View Profile
Re: Rotation anhand des Bodens
« Reply #5 on: January 12, 2013, 05:44:48 pm »
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?

Offline EgonOlsen

  • Administrator
  • quad
  • *****
  • Posts: 12298
    • View Profile
    • http://www.jpct.net
Re: Rotation anhand des Bodens
« Reply #6 on: January 12, 2013, 05:52:26 pm »
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.