public CollisionDataRB(Position collisionNormal, PositionMagnitude penetrationDepth, Rigidbody rigidbody1, Rigidbody rigidbody2) { CollisionNormal = collisionNormal; PenetrationDepth = penetrationDepth; RigidBody1 = rigidbody1; RigidBody2 = rigidbody2; }
// public static Position IntersectCircleCircle(Circle circle1, Circle circle2) { // return (circle1.Position + circle2.Position) / 2; // } public static CollisionDataRB CollisionCircleCircle(Circle circle1, Circle circle2, Rigidbody rb1, Rigidbody rb2) { //TODO; would the Velocity be global or local - so would I have to translate it or not circle1 = new Circle(circle1.Radius * rb1.GameObject.Transform.Scale); circle2 = new Circle(circle2.Radius * rb2.GameObject.Transform.Scale); Position distPos = rb2.GameObject.Transform.Position - rb1.GameObject.Transform.Position; // positionA --- positionB = fullDistance eg 10 // rA + rB = rGes eg 15 // rGes - fullDistance = penetrationDepth eg 15 - 10 = 5 // penetrationDepth / 2 = halfDepth (macht weniger Sinn) // OPT: This has to be done to prevent a division by zero; however, this occurs very rearly and the result of using it would be undefined anyway // the normalisation could be ommited in the if, but for GPUs it might be more effective for better streamlining to still do it // (is this actually true; in both cases I have to do it) if (distPos == new Position(0, 0)) { distPos = new Position(1, 0); } // I do calculate the square here twice -.- PositionMagnitude penetrationDepth = (circle1.Radius + circle2.Radius) - distPos.magnitude; return(new CollisionDataRB(distPos.normalized, penetrationDepth, rb1, rb2)); }
// public static Position IntersectAABBCircle(AABB aABB, Circle circle) { // //TODO // // not sure where the middle point of those is // // I can find the closest point on the rect to the circle // // Should I just take the middle of that point and ...? what? // return new Position(0, 0); // } // public static Collision CollisionAABBCircle(AABB aabb, Circle circle) { // bool doIntersect = DoIntersectAABBCircle(aabb, circle); // Position position = IntersectAABBCircle(aabb, circle); // //TODO calculate resolving vector // return new Collision(doIntersect, position); // } // #endregion // #region [CircleCircle] public static bool DoIntersectCircleCircle(Circle circle1, Circle circle2, Transform2D transform1, Transform2D transform2) { Circle translatedCircle1 = new Circle(transform1.Scale * circle1.Radius); // position is not in here -.- Circle translatedCircle2 = new Circle(transform2.Scale * circle2.Radius); // position is not in here -.- PositionMagnitude maxRadius = translatedCircle1.Radius + translatedCircle2.Radius; return((transform1.Position - transform2.Position).sqrMagnitude <= maxRadius * maxRadius); }
public Grid(PositionMagnitude cellSize, Position offset, Vector2Int cells) { f_cellSize = cellSize; f_offset = offset; f_cells = cells; f_cellRBs = new List <Rigidbody> [cells.y, cells.x]; s_emptyNodes = cells.y * cells.x; for (int x = 0; x < cells.x; ++x) { for (int y = 0; y < cells.y; ++y) { f_cellRBs[y, x] = new List <Rigidbody>(); } } }
public Grid(PositionMagnitude cellSize, AABB aabb) { f_cellSize = cellSize; f_offset = aabb.BottomLeft; f_cells = Vector2Int.CeilToInt((aabb.TopRight - aabb.BottomLeft) / f_cellSize); f_cellRBs = new List <Rigidbody> [f_cells.y, f_cells.x]; s_emptyNodes = f_cells.y * f_cells.x; for (int x = 0; x < f_cells.x; ++x) { for (int y = 0; y < f_cells.y; ++y) { f_cellRBs[y, x] = new List <Rigidbody>(); } } }
public static PositionMagnitude LerpUnclamped(PositionMagnitude a, PositionMagnitude b, float t) { return(new PositionMagnitude(Mathf.LerpUnclamped(a.Float, b.Float, t))); }
public static PositionMagnitude Clamp(PositionMagnitude value, PositionMagnitude min, PositionMagnitude max) { return(new PositionMagnitude(Mathf.Clamp(value.Float, min.Float, max.Float))); }
public static PositionMagnitude Max(PositionMagnitude a, PositionMagnitude b) { return(new PositionMagnitude(Mathf.Max(a.Float, b.Float))); }
public static PositionMagnitude Clamp01(PositionMagnitude value) { return(new PositionMagnitude(Mathf.Clamp01(value.Float))); }
public Capsule(Position position1, Position position2, PositionMagnitude radius) { Position1 = position1; Position2 = position2; Radius = radius; }
public Circle(/*Position position, */ PositionMagnitude radius) { //Position = position; Radius = radius; }