improve testMove

This commit is contained in:
RandomityGuy 2022-12-25 16:18:53 +05:30
parent 4a4b3f76b6
commit 3cfd42825f

View file

@ -59,6 +59,7 @@ import src.Resource;
import h3d.mat.Texture; import h3d.mat.Texture;
import collision.CCDCollision.TraceInfo; import collision.CCDCollision.TraceInfo;
import src.ResourceLoaderWorker; import src.ResourceLoaderWorker;
import src.InteriorObject;
class Move { class Move {
public var d:Vector; public var d:Vector;
@ -969,8 +970,8 @@ class Marble extends GameObject {
function testMove(velocity:Vector, position:Vector, deltaT:Float, radius:Float, testPIs:Bool):{position:Vector, t:Float, found:Bool} { function testMove(velocity:Vector, position:Vector, deltaT:Float, radius:Float, testPIs:Bool):{position:Vector, t:Float, found:Bool} {
var searchbox = new Bounds(); var searchbox = new Bounds();
searchbox.addSpherePos(this.x, this.y, this.z, _radius); searchbox.addSpherePos(position.x, position.y, position.z, _radius);
searchbox.addSpherePos(this.x + velocity.x * deltaT, this.y + velocity.y * deltaT, this.z + velocity.z * deltaT, _radius); searchbox.addSpherePos(position.x + velocity.x * deltaT, position.y + velocity.y * deltaT, position.z + velocity.z * deltaT, _radius);
var foundObjs = this.level.collisionWorld.boundingSearch(searchbox); var foundObjs = this.level.collisionWorld.boundingSearch(searchbox);
@ -979,14 +980,7 @@ class Marble extends GameObject {
var lastContactPos = new Vector(); var lastContactPos = new Vector();
function toDifPoint(vec:Vector) { for (obj in foundObjs.filter(x -> x.go is InteriorObject && !(x.go is PathedInterior))) {
return new Point3F(vec.x, vec.y, vec.z);
}
function fromDifPoint(vec:Point3F) {
return new Vector(vec.x, vec.y, vec.z);
}
for (obj in foundObjs) {
// Its an MP so bruh // Its an MP so bruh
var invMatrix = @:privateAccess obj.invTransform; var invMatrix = @:privateAccess obj.invTransform;
@ -1102,7 +1096,7 @@ class Marble extends GameObject {
} }
// Check if the collision hasn't already happened // Check if the collision hasn't already happened
if (edgeCollisionTime >= 0.0) { if (edgeCollisionTime >= 0.00001) {
var edgeLen = vertDiff.length(); var edgeLen = vertDiff.length();
var relativeCollisionPos = localpos.add(relLocalVel.multiply(edgeCollisionTime)).sub(thisVert); var relativeCollisionPos = localpos.add(relLocalVel.multiply(edgeCollisionTime)).sub(thisVert);
@ -1460,41 +1454,52 @@ class Marble extends GameObject {
} }
appliedImpulses = []; appliedImpulses = [];
var intersectData = testMove(velocity, this.getAbsPos().getPosition(), timeStep, _radius, true); // this.getIntersectionTime(timeStep, velocity); velocity.w = 0;
var intersectT = intersectData.t;
if (intersectData.found && intersectT > 0.001) {
var diff = timeStep - intersectT;
this.velocity = this.velocity.sub(A.multiply(diff));
this.omega = this.omega.sub(a.multiply(diff));
// var mo = new h3d.prim.Sphere();
// mo.addNormals();
// mo.scale(_radius);
// var mCol = new h3d.scene.Mesh(mo);
// mCol.setPosition(intersectData.position.x, intersectData.position.y, intersectData.position.z);
// this.level.scene.addChild(mCol);
timeStep = intersectT;
}
var pos = this.getAbsPos().getPosition(); var pos = this.getAbsPos().getPosition();
this.prevPos = pos.clone(); this.prevPos = pos.clone();
var posAdd = this.velocity.multiply(timeStep); var finalPosData = testMove(velocity, pos, timeStep, _radius, true); // this.getIntersectionTime(timeStep, velocity);
var expectedPos = pos.add(posAdd); if (finalPosData.found) {
var diff = timeStep - finalPosData.t;
this.velocity = this.velocity.sub(A.multiply(diff));
this.omega = this.omega.sub(a.multiply(diff));
timeStep = finalPosData.t;
}
var expectedPos = finalPosData.position;
var newPos = nudgeToContacts(expectedPos, _radius); var newPos = nudgeToContacts(expectedPos, _radius);
if (this.velocity.lengthSq() > 1e-8) {
var posDiff = newPos.sub(expectedPos);
if (posDiff.lengthSq() > 1e-8) {
var velDiffProj = this.velocity.multiply(posDiff.dot(this.velocity) / (this.velocity.lengthSq()));
var expectedProjPos = expectedPos.add(velDiffProj);
var updatedTimestep = expectedProjPos.sub(pos).length() / velocity.length();
var tDiff = updatedTimestep - timeStep; // var intersectT = intersectData.t;
this.velocity = this.velocity.sub(A.multiply(tDiff)); // if (intersectData.found && intersectT > 0.001) {
this.omega = this.omega.sub(a.multiply(tDiff)); // var diff = timeStep - intersectT;
// this.velocity = this.velocity.sub(A.multiply(diff));
// this.omega = this.omega.sub(a.multiply(diff));
// // var mo = new h3d.prim.Sphere();
// // mo.addNormals();
// // mo.scale(_radius);
// // var mCol = new h3d.scene.Mesh(mo);
// // mCol.setPosition(intersectData.position.x, intersectData.position.y, intersectData.position.z);
// // this.level.scene.addChild(mCol);
// timeStep = intersectT;
// }
timeStep = updatedTimestep; // var posAdd = this.velocity.multiply(timeStep);
} // var expectedPos = pos.add(posAdd);
} // var newPos = nudgeToContacts(expectedPos, _radius);
// if (this.velocity.lengthSq() > 1e-8) {
// var posDiff = newPos.sub(expectedPos);
// if (posDiff.lengthSq() > 1e-8) {
// var velDiffProj = this.velocity.multiply(posDiff.dot(this.velocity) / (this.velocity.lengthSq()));
// var expectedProjPos = expectedPos.add(velDiffProj);
// var updatedTimestep = expectedProjPos.sub(pos).length() / velocity.length();
// var tDiff = updatedTimestep - timeStep;
// this.velocity = this.velocity.sub(A.multiply(tDiff));
// this.omega = this.omega.sub(a.multiply(tDiff));
// timeStep = updatedTimestep;
// }
// }
piTime += timeStep; piTime += timeStep;
if (this.controllable) { if (this.controllable) {