Thread Rating:
  • 0 Vote(s) - 0 Average
  • 1
  • 2
  • 3
  • 4
  • 5
Help  Collision works buggy
#1
Hi,
I have some problems with collisions. I am using the code below for each collision to get the touching each other rope but it gives wrong/inconsistent data.
Here each rope touching each other should be having darker tone. I tried different settings and it did not change. Ropes are in the same z-axis and they definitely touch as I checked from different angles. Surface collision is open, all works as expected, I am using the latest 6.0.1 version.
Here is a video : Video
Do anyone having the same issue who can help me?  Ángel
Thanks!

Code:
using UnityEngine;
using Obi;

public class RopeCollision : MonoBehaviour
{

    ObiSolver solver;

    void Start()
    {
        solver = GetComponent<ObiSolver>();
        solver.OnParticleCollision += Solver_OnCollision;
    }

    void OnDisable()
    {
        solver.OnParticleCollision -= Solver_OnCollision;
    }

    void Solver_OnCollision(object sender, ObiSolver.ObiCollisionEventArgs e)
    {
        var world = ObiColliderWorld.GetInstance();

        foreach (Oni.Contact contact in e.contacts)
        {
            var pa = solver.particleToActor[contact.bodyA];
            var po = solver.particleToActor[contact.bodyB];
            if (pa == null || po == null)
                return;
            if (pa.actor.gameObject.name != po.actor.gameObject.name)
            {
                //print(pa.actor.gameObject+" , "+ po.actor.gameObject);
                GameManager.Instance.Colliding(pa.actor.gameObject, po.actor.gameObject);
            }
        }
       
    }

}
Reply
#2
Hi there,

Your code is incorrect: you're using contact.bodyA and bodyB as if they were particle indices, but they're simplex indices. This will result in pretty much random results, or even out of bounds array access exceptions. See the docs:
http://obi.virtualmethodstudio.com/tutor...sions.html

Specifically, the "Retrieving the particle involved in a contact" section.

Let me know if you need further help.

cheers!
Reply
#3
Himm I tried everything on that side before and today as well.
I couldn't find a stable way to get if two different ropes are touching each other. I got a lot of same rope touching itself but not stably each other. I started to sort all simplices in scene and comparing distances but it needs huge processing power.
Could you please give me a simple pseudo code to get if ropes touching each other and which. So that I will know what to fiddle with?

Thanks
Reply
#4
There's code for this in the above link to the manual, that you can just copypaste. Retrieve the actor for each simplex:

Code:
// retrieve the offset and size of the simplex in the solver.simplices array:
int simplexStart = solver.simplexCounts.GetSimplexStartAndSize(contact.bodyA, out int simplexSize);

// get first particle in the simplex:
int firstParticle = solver.simplices[simplexStart];

// retrieve the actor to which this particle belongs:
ObiSolver.ParticleInActor pa = solver.particleToActor[firstParticle];
var actor = pa.actor;

You do this for both contact.bodyA and contact.bodyB, then compare their respective actors to see if they're the same or not. There's nothing more to it.

Let me know if you need further help. cheers!
Reply