mirror of
https://github.com/RandomityGuy/MBHaxe.git
synced 2026-04-26 12:41:40 +00:00
try make ccd better?
This commit is contained in:
parent
2603538dba
commit
71dca08a7d
1 changed files with 55 additions and 9 deletions
|
|
@ -1,5 +1,7 @@
|
||||||
package src;
|
package src;
|
||||||
|
|
||||||
|
import collision.gjk.GJK;
|
||||||
|
import collision.gjk.ConvexHull;
|
||||||
import hxd.snd.effect.Pitch;
|
import hxd.snd.effect.Pitch;
|
||||||
import hxd.snd.effect.Spatialization;
|
import hxd.snd.effect.Spatialization;
|
||||||
import hxd.snd.Channel;
|
import hxd.snd.Channel;
|
||||||
|
|
@ -741,12 +743,16 @@ class Marble extends GameObject {
|
||||||
return new Point3F(vec.x, vec.y, vec.z);
|
return new Point3F(vec.x, vec.y, vec.z);
|
||||||
}
|
}
|
||||||
|
|
||||||
var intersectT = 10e8;
|
var maxIntersectDist = 0.0;
|
||||||
|
var contactNorm = new Vector();
|
||||||
|
var contactPt = null;
|
||||||
|
|
||||||
var traceinfo = new TraceInfo();
|
var traceinfo = new TraceInfo();
|
||||||
|
|
||||||
traceinfo.resetTrace(position.clone(), position.add(velocity.multiply(dt)), this._radius);
|
traceinfo.resetTrace(position.clone(), position.add(velocity.multiply(dt)), this._radius);
|
||||||
|
|
||||||
|
var foundTriangles = [];
|
||||||
|
|
||||||
for (obj in foundObjs) {
|
for (obj in foundObjs) {
|
||||||
var radius = _radius;
|
var radius = _radius;
|
||||||
|
|
||||||
|
|
@ -784,7 +790,27 @@ class Marble extends GameObject {
|
||||||
|
|
||||||
var surfacenormal = surface.normals[surface.indices[i]].transformed3x3(obj.transform);
|
var surfacenormal = surface.normals[surface.indices[i]].transformed3x3(obj.transform);
|
||||||
|
|
||||||
traceinfo.traceSphereTriangle(v0, v, v2);
|
foundTriangles.push(v0);
|
||||||
|
foundTriangles.push(v);
|
||||||
|
foundTriangles.push(v2);
|
||||||
|
// foundTriangles.push(surfacenormal);
|
||||||
|
|
||||||
|
traceinfo.resetTrace(position.clone(), position.add(velocity.multiply(dt)), this._radius);
|
||||||
|
traceinfo.traceSphereTriangle(v2, v, v0);
|
||||||
|
|
||||||
|
if (traceinfo.collision) {
|
||||||
|
var tcolpos = traceinfo.getTraceEndpoint();
|
||||||
|
var closest = Collision.ClosestPtPointTriangle(tcolpos, _radius, v2, v, v0, surfacenormal);
|
||||||
|
if (closest != null) {
|
||||||
|
var dist = tcolpos.sub(closest);
|
||||||
|
var distlen = dist.length();
|
||||||
|
if (maxIntersectDist < distlen && distlen < _radius) {
|
||||||
|
maxIntersectDist = distlen;
|
||||||
|
contactNorm = dist.normalized();
|
||||||
|
contactPt = closest;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// var closest = Collision.IntersectTriangleCapsule(position, position.add(relVelocity.multiply(dt)), _radius, v0, v, v2, surfacenormal);
|
// var closest = Collision.IntersectTriangleCapsule(position, position.add(relVelocity.multiply(dt)), _radius, v0, v, v2, surfacenormal);
|
||||||
// var closest = Collision.IntersectTriangleSphere(v0, v, v2, surfacenormal, position, radius);
|
// var closest = Collision.IntersectTriangleSphere(v0, v, v2, surfacenormal, position, radius);
|
||||||
|
|
@ -808,17 +834,37 @@ class Marble extends GameObject {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (traceinfo.collision) {
|
if (maxIntersectDist > 0) {
|
||||||
var traceDist = traceinfo.getTraceDistance();
|
var finalPos = contactPt.add(contactNorm.multiply(_radius));
|
||||||
var t = traceDist / velocity.length();
|
|
||||||
if (t < intersectT) {
|
// Nudge the finalPos to the surface of the object
|
||||||
intersectT = t;
|
|
||||||
}
|
var chull = new ConvexHull(foundTriangles);
|
||||||
|
var sph = new collision.gjk.Sphere();
|
||||||
|
sph.position = finalPos;
|
||||||
|
sph.radius = _radius;
|
||||||
|
|
||||||
|
var pt = GJK.gjk(sph, chull);
|
||||||
|
|
||||||
|
if (pt != null) {
|
||||||
|
finalPos = finalPos.sub(pt);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
var colpos = finalPos;
|
||||||
|
var msh = new h3d.prim.Sphere();
|
||||||
|
var prim = new h3d.scene.Mesh(msh);
|
||||||
|
msh.addNormals();
|
||||||
|
prim.setTransform(Matrix.T(colpos.x, colpos.y, colpos.z));
|
||||||
|
prim.setScale(this._radius);
|
||||||
|
this.level.scene.addChild(prim);
|
||||||
|
|
||||||
|
var intersectT = finalPos.sub(position).length() / velocity.length();
|
||||||
return intersectT;
|
return intersectT;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return 10e8;
|
||||||
|
}
|
||||||
|
|
||||||
function advancePhysics(timeState:TimeState, m:Move, collisionWorld:CollisionWorld, pathedInteriors:Array<PathedInterior>) {
|
function advancePhysics(timeState:TimeState, m:Move, collisionWorld:CollisionWorld, pathedInteriors:Array<PathedInterior>) {
|
||||||
var timeRemaining = timeState.dt;
|
var timeRemaining = timeState.dt;
|
||||||
var it = 0;
|
var it = 0;
|
||||||
|
|
@ -855,7 +901,7 @@ class Marble extends GameObject {
|
||||||
var intersectT = this.getIntersectionTime(timeStep, velocity);
|
var intersectT = this.getIntersectionTime(timeStep, velocity);
|
||||||
|
|
||||||
if (intersectT < timeStep && intersectT >= 0.00001) {
|
if (intersectT < timeStep && intersectT >= 0.00001) {
|
||||||
trace('CCD AT t = ${intersectT}');
|
// trace('CCD AT t = ${intersectT}');
|
||||||
intersectT *= 0.8; // We uh tick the shit to not actually at the contact time cause bruh
|
intersectT *= 0.8; // We uh tick the shit to not actually at the contact time cause bruh
|
||||||
// intersectT /= 2;
|
// intersectT /= 2;
|
||||||
var diff = timeStep - intersectT;
|
var diff = timeStep - intersectT;
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue