Obi Official Forum

Full Version: Reset rope starting shape?
You're currently viewing a stripped down version of our content. View the full version with proper formatting.
I have a coiled rope that unwinds nicely when the rope is enabled. I want to have the rope reset to it's starting coiled shape every time I activate it. How to I reset the rope to it's original shape?
(13-02-2020, 12:18 PM)basilisk Wrote: [ -> ]I have a coiled rope that unwinds nicely when the rope is enabled. I want to have the rope reset to it's starting coiled shape every time I activate it. How to I reset the rope to it's original shape?

All you need to do is set the solver's particle positions/velocities to the ones stored in the blueprint. If you're using a rod (which makes use of oriented particles), do the same with particle orientations/angular velocities.

Only thing you need to be a bit careful with is converting the blueprint data (which is expressed in local space) to solver space. Like this:

Code:
void Reset(ObiActor actor)
{
        if (actor.isLoaded)
        {
            Matrix4x4 l2sTransform = actor.actorLocalToSolverMatrix;
            Quaternion l2sRotation = l2sTransform.rotation;

            for (int i = 0; i < actor.particleCount; ++i)
            {
                int solverIndex = actor.solverIndices[i];

                actor.solver.positions[solverIndex]  = l2sTransform.MultiplyPoint3x4(actor.blueprint.positions[i]);
                actor.solver.velocities[solverIndex] = l2sTransform.MultiplyVector(actor.blueprint.velocities[i]);

                if (actor.usesOrientedParticles)
                {
                    actor.solver.orientations[solverIndex] = l2sRotation * actor.blueprint.orientations[i];
                    actor.solver.angularVelocities[solverIndex] = l2sTransform.MultiplyVector(actor.blueprint.angularVelocities[i]);
                }
            }
        }
}

See:
http://obi.virtualmethodstudio.com/tutor...icles.html
Thank you, this works. But oddly, I am getting an error...


Code:
NullReferenceException: Object reference not set to an instance of an object

error at the line:


Code:
if (actor.isLoaded)

The rope shape is still being reset like I want even with this null error, so it works but I'd like to eliminate the error.


They way I've set it up is a public ObiActor myRope variable where I assign the rope GameObject in the editor, and when I want the rope to reset reset I pass myRope into...
Code:
void Reset(ObiActor actor)


Any idea why this null error is happening?
(13-02-2020, 02:54 PM)basilisk Wrote: [ -> ]Thank you, this works. But oddly, I am getting an error...


Code:
NullReferenceException: Object reference not set to an instance of an object

error at the line:


Code:
if (actor.isLoaded)

The rope shape is still being reset like I want even with this null error, so it works but I'd like to eliminate the error.


They way I've set it up is a public ObiActor myRope variable where I assign the rope GameObject in the editor, and when I want the rope to reset reset I pass myRope into...
Code:
void Reset(ObiActor actor)


Any idea why this null error is happening?

As far as your description goes, a null ref error in

Code:
if (actor.isLoaded)

can only indicate that "actor" is null. Maybe try using

Code:
if (actor != null && actor.isLoaded)

instead, if you plan on passing null sometimes? As to why is null being passed into the function, that's something I cannot know without looking at your actual code...
Sorry! Yep, it was completely my fault. Bad piece of code on my side.

Thank you for your help. ObiRope is great!