Thread Rating:
  • 0 Vote(s) - 0 Average
  • 1
  • 2
  • 3
  • 4
  • 5
Help  Make damaged rope
#1
Pregunta 
Greetings,

How do you think I can supply the damaged rope in the picture with obi rope? Should I find the relevant particle and place a 3d object with this appearance on it? I am open to your suggestions.


Attached Files Thumbnail(s)
   
Reply
#2
(22-11-2021, 11:24 AM)greyhawk Wrote: Greetings,

How do you think I can supply the damaged rope in the picture with obi rope? Should I find the relevant particle and place a 3d object with this appearance on it? I am open to your suggestions.

Yes, you could find the "damaged" particle and place an object there using the particle API:
http://obi.virtualmethodstudio.com/manua...icles.html

Note this would just give you a position to place the object at, not an orientation (remember that ropes do not model torsion, unlike rods).

You could also just determine the damaged zone using a normalized coordinate from 0 (start of the rope) to 1 (end of the rope) and use pathSmoother.GetSectionAt(coordinate). This returns an orthonormal frame, complete with position and orientation - in case of ropes, since the simulation does not output an orientation, orientation is determined using parallel transport.

There's a utility script included that will place an object at a normalized position in the rope using GetSectionAt:
/Obi/Scripts/RopeAndRod/Utils/ObiRopeAttach.cs
Reply
#3
(22-11-2021, 11:33 AM)josemendez Wrote: Yes, you could find the "damaged" particle and place an object there using the particle API:
http://obi.virtualmethodstudio.com/manua...icles.html

Note this would just give you a position to place the object at, not an orientation (remember that ropes do not model torsion, unlike rods).

You could also just determine the damaged zone using a normalized coordinate from 0 (start of the rope) to 1 (end of the rope) and use pathSmoother.GetSectionAt(coordinate). This returns an orthonormal frame, complete with position and orientation - in case of ropes, since the simulation does not output an orientation, orientation is determined using parallel transport.

There's a utility script included that will place an object at a normalized position in the rope using GetSectionAt:
/Obi/Scripts/RopeAndRod/Utils/ObiRopeAttach.cs

How can I get the coordinate you mentioned when an object touches the area I want to damage?
Reply
#4
(22-11-2021, 01:05 PM)greyhawk Wrote: How can I get the coordinate you mentioned when an object touches the area I want to damage?

Simply divide the index of the particle (or element) by the amount of particles or elements in the rope.
Reply
#5
(22-11-2021, 01:15 PM)josemendez Wrote: Simply divide the index of the particle (or element) by the amount of particles or elements in the rope.
Thank you, it is working.
Reply
#6
(22-11-2021, 01:15 PM)josemendez Wrote: Simply divide the index of the particle (or element) by the amount of particles or elements in the rope.

Hi, its me again. 


I didn't want to open a separate post because the problem I'm having now is after the solution here. I am experiencing the error in the image when I cut the rope after placing the object showing the damage. do you have a suggestion? Due to this error, the damaged object does not follow the rope.


Attached Files Thumbnail(s)
   
Reply
#7
(22-11-2021, 03:40 PM)greyhawk Wrote: Hi, its me again. 


I didn't want to open a separate post because the problem I'm having now is after the solution here. I am experiencing the error in the image when I cut the rope after placing the object showing the damage. do you have a suggestion? Due to this error, the damaged object does not follow the rope.

This can only happen if the constraints are still in a dirty state (ie, the amount of elements in the rope and constraints the solver don't match.)
Are you rebuilding the constraints after cutting the rope? Can you share your code for tearing the rope?
Reply
#8
(22-11-2021, 04:05 PM)josemendez Wrote: This can only happen if the constraints are still in a dirty state (ie, the amount of elements in the rope and constraints the solver don't match.)
Are you rebuilding the constraints after cutting the rope? Can you share your code for tearing the rope?

Here my code:

Code:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using Obi;

namespace _Game.Scripts.Entities.Rope
{
    [RequireComponent(typeof(ObiSolver))]
    public class RopeCutter : MonoBehaviour
    {
        private ObiSolver solver;
        private ObiRope currentRope;
        public GameObject damagezone;

        void Awake(){
            solver = GetComponent<Obi.ObiSolver>();
        }

        void OnEnable () {
            solver.OnCollision += Solver_OnCollision;
        }

        void OnDisable(){
            solver.OnCollision -= Solver_OnCollision;
        }
        void Solver_OnCollision(object sender, ObiSolver.ObiCollisionEventArgs e)
        {
            var world = ObiColliderWorld.GetInstance();

            // just iterate over all contacts in the current frame:
            foreach (Oni.Contact contact in e.contacts)
            {
                // if this one is an actual collision:

                ObiColliderBase col = world.colliderHandles[contact.bodyB].owner;
                if (col != null)
                {
                    if (col.CompareTag("saw"))
                    {
                        TearRope(col, contact);
                    }
                    else if (col.CompareTag("nearMiss"))
                    {
                        DamageRope(col, contact);
                    }

                }
            }
        }

        private IEnumerator ReservationRope(ObiRope actor)
        {
            currentRope = actor;
            yield return new WaitForSeconds(1f);
            currentRope = null;
        }
       
        private void DamageRope(ObiColliderBase col, Oni.Contact contact)
        {
// get the particle index:
            int particleIndex = solver.simplices[contact.bodyA];

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

// not a rope, stop:
            if (actor == null) return;
            float i = -1;
// check rope elements and tear the one that references this particle:
            foreach (var elm in actor.elements)
            {
                i++;
                if (elm.particle1 == particleIndex)
                {
                    if (actor!=currentRope)
                    {
                        var obj = Instantiate(damagezone);
                        obj.GetComponent<ObiRopeAttach>().m = i / actor.elements.Count;
                        obj.GetComponent<ObiRopeAttach>().generator = actor.GetComponent<ObiPathSmoother>();
                        obj.GetComponent<ObiRopeAttach>()._continue = true;
                        //actor.Tear(elm);
                        StartCoroutine(ReservationRope(actor));

                    }
                    break;
                }
            }

        }
       
        private void TearRope(ObiColliderBase col, Oni.Contact contact)
        {
// get the particle index:
            int particleIndex = solver.simplices[contact.bodyA];
           
// retrieve the actor this particle belongs to:
            ObiSolver.ParticleInActor pa = solver.particleToActor[particleIndex];
            var actor = pa.actor as ObiRope;

// not a rope, stop:
            if (actor == null) return;
// check rope elements and tear the one that references this particle:
            foreach (var elm in actor.elements)
            {
                if (elm.particle1 == particleIndex)
                {
                    actor.Tear(elm);
                        actor.GetComponent<RopeController>().OnRopeTear();
                        actor.RebuildConstraintsFromElements();

                        break;
                }
            }

        }
       
    }
}
Reply
#9
(22-11-2021, 04:05 PM)josemendez Wrote: This can only happen if the constraints are still in a dirty state (ie, the amount of elements in the rope and constraints the solver don't match.)
Are you rebuilding the constraints after cutting the rope? Can you share your code for tearing the rope?

Am i missing something?
Reply
#10
(23-11-2021, 11:44 AM)greyhawk Wrote: Am i missing something?

Haven't had a chance to try and debug your code yet. Will do so and get back to you asap.
Reply