Moin!
Ich bastle gerade an einer Physikengine, die ein realistisches Verhalten im Raum simulieren soll. Von der Gravitation her läuft schon alles, aber bei Kollisionen bekomme ich keinen richtigen Ansatz. Ich habe zwar schon Lösungen per Vektorrechnung gesehen, aber mit Mathematik aus der 11 komm ich da leider nicht hinter...
Hier erstmal ein Ausschnitt des bisherigen Codes:
Bisher invertiere ich einfach nur die Geschwindigkeiten...
Ich hoffe mal, ihr könnt mir nen guten Ansatz geben...
Danke im Voraus, Sibbo
Ich bastle gerade an einer Physikengine, die ein realistisches Verhalten im Raum simulieren soll. Von der Gravitation her läuft schon alles, aber bei Kollisionen bekomme ich keinen richtigen Ansatz. Ich habe zwar schon Lösungen per Vektorrechnung gesehen, aber mit Mathematik aus der 11 komm ich da leider nicht hinter...
Hier erstmal ein Ausschnitt des bisherigen Codes:
Java:
class Matter
{
private double mass; // Kilogram
private double x, y, z; // Meters
private double xMove, yMove, zMove; // Newton
private double xyRotation, xzRotation, yzRotation; // Newtonmeter
public synchronized void interact(Matter matter)
{
double xPart = matter.x - x;
double yPart = matter.y - y;
double zPart = matter.z - z;
double mulMass = mass * matter.mass;
double totalMass = mass + matter.mass;
double distance = Physics.pythagoras(xPart, yPart);
distance = Physics.pythagoras(distance, zPart);
double vectorSpeedSelf = Physics.pythagoras(xMove, yMove);
distance = Physics.pythagoras(vectorSpeedSelf, zMove);
double vectorSpeedMatter = Physics.pythagoras(matter.xMove, matter.yMove);
distance = Physics.pythagoras(vectorSpeedMatter, matter.zMove);
// Collision
boolean collided = false;
switch (form)
{
case FORM_SPHERE:
if (checkCollision && distance <= dimension[0] + matter.dimension[0])
{
collided = true;
massEffect = false;
checkCollision = false;
xMove = -xMove * matter.mass / totalMass;
yMove = -yMove * matter.mass / totalMass;
zMove = -zMove * matter.mass / totalMass;
matter.xMove = -matter.xMove * mass / totalMass;
matter.yMove = -matter.yMove * mass / totalMass;
matter.zMove = -matter.zMove * mass / totalMass;
}
else
checkCollision = true;
break;
}
// Mass Acceleration
if (massEffect)
{
double massAcceleration = Physics.G * mulMass / Physics.sqr(distance) * Physics.TIME_PER_UPDATE;
double newXPart = xPart;
double newYPart = yPart;
double newZPart = zPart;
/*double newXPart = Math.signum(xPart) * Math.sqrt(distance - Physics.pythagoras(yPart, zPart));
double newYPart = Math.signum(yPart) * Math.sqrt(distance - Physics.pythagoras(xPart, zPart));
double newZPart = Math.signum(zPart) * Math.sqrt(distance - Physics.pythagoras(yPart, xPart));*/
newXPart /= distance * 2;
newYPart /= distance * 2;
newZPart /= distance * 2;
xMove += newXPart * massAcceleration;
yMove += newYPart * massAcceleration;
zMove += newZPart * massAcceleration;
matter.xMove += -newXPart * massAcceleration;
matter.yMove += -newYPart * massAcceleration;
matter.zMove += -newZPart * massAcceleration;
}
else
massEffect = true;
}
}
Bisher invertiere ich einfach nur die Geschwindigkeiten...
Ich hoffe mal, ihr könnt mir nen guten Ansatz geben...
Danke im Voraus, Sibbo