- Home /
How can I simulate a short-distance attraction between RigidBodies A and B, with the mutual pull always being between the center of A and the closest point in B's collision mesh?
I need some help figuring out how I can create a force that will pull two RigidBodies together, with the direction of that force always being between the center of a "main" Rigidbody (let's call it C) and the closest point of any collision mesh in relation to that center (let's call that one P).
The ideal would be for the whole thing to rely on a "main" RigidBody that will be acting on any other RigidBody it gets close to, by getting attracted to the closest point of any collision mesh in range. However, instead of being pulled towards the center of the other RigidBody or the center of the closest face, it is pulled towards P. Similarly, but more complicated, the other RigidBody gets pulled at P instead of its center of mass, which would create torque if not aligned with the RigidBody's center of mass.
When using simple collision meshes, this effect could be simplified to the main Rigid Body being pulled towards the closest face, parallel with that face's normal, while the target RigidBody also gets pulled along that normal.
It would also be nice to disable this attraction if the RigidBodies are colliding, as to prevent phantom forces. I'm not really sure how Unity calculates its collisions, but from what I can observe, when two RigidBodies are intersecting, a repellent force is projected for as long as they are overlapping, and a force seems to be created along the normal for as long as they are colliding, as it is possible to spin a RigidBody through uncentered collisions.
This leads me to believe that what I want is kind of the opposite of a normal collision: A force of attraction that only exist when there is no collision, does not pull a RigidBody by its center of mass and is parallel to the normal of the pulling point.
This is supposed to be a short-distance attraction, though, so the force should decay with distance, being rounded to zero after it gets small enough (maybe the point in which that happens could be used to define a limit for all these calculations in order to make it more efficient?). The attraction being between C and P is also very important for the desired behavior, since with changes in the direction of P in relation to C, an orbiting behavior would arise, shall the main RigidBody be too fast to come in contact with the target.
The ideal would be for this to apply to any RigidBody without the need of listing them in the code beforehand, with the main RigidBody being the only one trully named in code. If needed, the whole torque thing can be ditched, having the target RigidBodies simply be pulled along the normal of P.
I know this must be extremely complex and I don't even know where to start, but I know it must be somehow possible. I'm sure there will probably be some raycasting involved, but I have no idea on how I would make it find P.
Any help is extremely appreciated.