From 971a397a638c3c78b0cc7671a0138f86a433b2bc Mon Sep 17 00:00:00 2001 From: RandomityGuy <31925790+RandomityGuy@users.noreply.github.com> Date: Mon, 7 Jun 2021 21:48:51 +0530 Subject: [PATCH] More CCD fixes --- src/Main.hx | 29 +++++++++++++--------- src/Marble.hx | 67 ++++++++++++++++++++++++++------------------------- 2 files changed, 51 insertions(+), 45 deletions(-) diff --git a/src/Main.hx b/src/Main.hx index aceb74b9..5cae616d 100644 --- a/src/Main.hx +++ b/src/Main.hx @@ -38,8 +38,8 @@ class Main extends hxd.App { override function init() { super.init(); - // dtsObj = new SuperSpeed(); - // dtsObj.x = -3; + dtsObj = new SuperSpeed(); + dtsObj.x = -3; world = new MarbleWorld(s3d); @@ -89,23 +89,28 @@ class Main extends hxd.App { // world.addPathedInterior(pi); - // world.addDtsObject(dtsObj); + world.addDtsObject(dtsObj); - // var sj = new SuperJump(); - // sj.x = 3; - // world.addDtsObject(sj); + var sj = new SuperJump(); + sj.x = 3; + world.addDtsObject(sj); - // var sb = new SuperBounce(); - // sb.y = 3; - // world.addDtsObject(sb); + var sj2 = new SuperJump(); + sj2.x = 3; + sj2.z = 2; + world.addDtsObject(sj2); + + var sb = new SuperBounce(); + sb.y = 3; + world.addDtsObject(sb); var sh = new ShockAbsorber(); sh.y = -3; world.addDtsObject(sh); - // var he = new Helicopter(); - // world.addDtsObject(he); - // sj.setTransform(sj.getTransform()); + var he = new Helicopter(); + world.addDtsObject(he); + sj.setTransform(sj.getTransform()); // for (i in 0...10) { // for (j in 0...10) { diff --git a/src/Marble.hx b/src/Marble.hx index 6c3a6b60..83d95fc7 100644 --- a/src/Marble.hx +++ b/src/Marble.hx @@ -484,13 +484,13 @@ class Marble extends GameObject { this._bounceNormal = normal; } - function getIntersectionTime(dt:Float, velocity:Vector, pathedInteriors:Array, collisionWorld:CollisionWorld) { + function getIntersectionTime(dt:Float, velocity:Vector) { var expandedcollider = new SphereCollisionEntity(cast this); var position = this.getAbsPos().getPosition(); expandedcollider.transform = Matrix.T(position.x, position.y, position.z); - expandedcollider.radius = this.getAbsPos().getPosition().distance(position) + _radius; + expandedcollider.radius = velocity.multiply(dt).length() + _radius; - var foundObjs = collisionWorld.radiusSearch(position, expandedcollider.radius); + var foundObjs = this.level.collisionWorld.radiusSearch(position, expandedcollider.radius); function toDifPoint(vec:Vector) { return new Point3F(vec.x, vec.y, vec.z); @@ -499,47 +499,45 @@ class Marble extends GameObject { var intersectT = 10e8; for (obj in foundObjs) { - if (obj.velocity.length() > 0) { - var radius = _radius; + var radius = expandedcollider.radius; - var invMatrix = obj.transform.clone(); - invMatrix.invert(); - var localpos = position.clone(); - localpos.transform(invMatrix); - var surfaces = obj.octree.radiusSearch(localpos, radius * 1.1); + var invMatrix = obj.transform.clone(); + invMatrix.invert(); + var localpos = position.clone(); + localpos.transform(invMatrix); + var surfaces = obj.octree.radiusSearch(localpos, radius * 1.1); - var tform = obj.transform.clone(); - var velDir = obj.velocity.normalized(); - // tform.setPosition(tform.getPosition().add(velDir.multiply(_radius))); - tform.setPosition(tform.getPosition().add(obj.velocity.multiply(dt)).sub(velDir.multiply(_radius))); + var tform = obj.transform.clone(); + var velDir = obj.velocity.normalized(); + // tform.setPosition(tform.getPosition().add(velDir.multiply(_radius))); + tform.setPosition(tform.getPosition().add(obj.velocity.multiply(dt)).sub(velDir.multiply(_radius))); - var contacts = []; + var contacts = []; - for (surf in surfaces) { - var surface:CollisionSurface = cast surf; + for (surf in surfaces) { + var surface:CollisionSurface = cast surf; - var i = 0; - while (i < surface.indices.length) { - var v0 = surface.points[surface.indices[i]].transformed(tform); - var v = surface.points[surface.indices[i + 1]].transformed(tform); - var v2 = surface.points[surface.indices[i + 2]].transformed(tform); + var i = 0; + while (i < surface.indices.length) { + var v0 = surface.points[surface.indices[i]].transformed(tform); + var v = surface.points[surface.indices[i + 1]].transformed(tform); + var v2 = surface.points[surface.indices[i + 2]].transformed(tform); - var polyPlane = PlaneF.ThreePoints(toDifPoint(v0), toDifPoint(v), toDifPoint(v2)); + var polyPlane = PlaneF.ThreePoints(toDifPoint(v0), toDifPoint(v), toDifPoint(v2)); - var surfacenormal = surface.normals[surface.indices[i]].transformed3x3(obj.transform); + var surfacenormal = surface.normals[surface.indices[i]].transformed3x3(obj.transform); - var t = (-position.dot(surfacenormal) - polyPlane.d) / velocity.dot(surfacenormal); + var t = (-position.dot(surfacenormal) - polyPlane.d) / velocity.dot(surfacenormal); - var pt = position.add(velocity.multiply(t)); + var pt = position.add(velocity.multiply(t)); - if (Collision.PointInTriangle(pt, v0, v, v2)) { - if (t > 0 && t < intersectT) { - intersectT = t; - } + if (Collision.PointInTriangle(pt, v0, v, v2)) { + if (t > 0 && t < intersectT) { + intersectT = t; } - - i += 3; } + + i += 3; } } } @@ -596,13 +594,16 @@ class Marble extends GameObject { this._contactTime += timeStep; } - var intersectT = this.getIntersectionTime(timeStep, velocity, pathedInteriors, collisionWorld); + var intersectT = this.getIntersectionTime(timeStep, velocity); if (intersectT < timeStep) { + intersectT *= 0.8; // We uh tick the shit to not actually at the contact time cause bruh + // intersectT /= 2; var diff = timeStep - intersectT; this.velocity = this.velocity.sub(A.multiply(diff)); this.omega = this.omega.sub(a.multiply(diff)); timeStep = intersectT; + trace("CCD"); } piTime += timeStep;