Posts: 8
Threads: 4
Joined: Feb 2018
Reputation:
0
Hey there!
I want to snap the ObiRope to the block i have in scene in runtime. I can snap one end of the ObiRope but the other end of ObiRope doesn't seem to be working i simply check for conditions (collider trigger, onMouseUp, etc.) and remove the PinConstraint from Spheres then add new PinConstraint to the block
As you can see in the video, white sphere (which is Pinned to the first particle) does what i want but the black one doesn't. I can't get the last particle of ObiRope. Here's my code for snapping:
Code: int addIndex; //Index of particle which i add PinConstraint (to block)
int removeIndex; //Index of particle which i remove PinConstraint (from sphere)
if (gameObject.name == "WhiteSphere")
{
//Remove the second PinConstraint & add PinConstraint to the first particle
addIndex = 0;
removeIndex = 1;
}
else
{
//Remove the first PinConstraint & add PinConstraint to the last particle
addIndex = obiRope.UsedParticles;
removeIndex = 0;
}
obiRope.PinConstraints.RemoveFromSolver(null);
ObiPinConstraintBatch batch = (ObiPinConstraintBatch)obiRope.PinConstraints.GetBatches()[0];
batch.RemoveConstraint(removeIndex);
batch.AddConstraint(addIndex, blockObiCollider, new Vector3(0.8f, 0, 0), 1);
obiRope.PinConstraints.AddToSolver(null);
Thanks in advance!
Posts: 6,348
Threads: 24
Joined: Jun 2017
Reputation:
400
Obi Owner:
22-02-2018, 08:58 AM
(This post was last modified: 22-02-2018, 08:59 AM by josemendez.)
(21-02-2018, 09:49 PM)Cannias Wrote: Hey there!
I want to snap the ObiRope to the block i have in scene in runtime. I can snap one end of the ObiRope but the other end of ObiRope doesn't seem to be working i simply check for conditions (collider trigger, onMouseUp, etc.) and remove the PinConstraint from Spheres then add new PinConstraint to the block
As you can see in the video, white sphere (which is Pinned to the first particle) does what i want but the black one doesn't. I can't get the last particle of ObiRope. Here's my code for snapping:
Code: int addIndex; //Index of particle which i add PinConstraint (to block)
int removeIndex; //Index of particle which i remove PinConstraint (from sphere)
if (gameObject.name == "WhiteSphere")
{
//Remove the second PinConstraint & add PinConstraint to the first particle
addIndex = 0;
removeIndex = 1;
}
else
{
//Remove the first PinConstraint & add PinConstraint to the last particle
addIndex = obiRope.UsedParticles;
removeIndex = 0;
}
obiRope.PinConstraints.RemoveFromSolver(null);
ObiPinConstraintBatch batch = (ObiPinConstraintBatch)obiRope.PinConstraints.GetBatches()[0];
batch.RemoveConstraint(removeIndex);
batch.AddConstraint(addIndex, blockObiCollider, new Vector3(0.8f, 0, 0), 1);
obiRope.PinConstraints.AddToSolver(null);
Thanks in advance!
last particle addIndex should be obiRope.UsedParticles -1. Arrays run from 0 to size-1
cheers!
Posts: 8
Threads: 4
Joined: Feb 2018
Reputation:
0
(22-02-2018, 08:58 AM)josemendez Wrote: last particle addIndex should be obiRope.UsedParticles-1. Arrays run from 0 to size-1
cheers!
Hi josemendez,
I did what you told me to do. It's now obiRope.UsedParticles-1. As you can see in this video, it works perfect for 6 particles (as Rope Length). But less than 6 particles, the rope behaves different which i couldn't understand. And for greater than 6 particles, it behaves exact same as 7 particles rope. I'm going out of my mind, help please
P.S. I have a prefab which contains the obiRope, WhiteSphere and the BlackSphere. As in prefab, spheres are pinned to the ends of the rope. And I have a script called MovePin. So the moving spheres with mouse, changing rope length due to distance between two spheres, changing rope UV scale and snapping rope ends to the block stuffs are made in MovePin script. And i have the script on both of spheres and each one works for itself. Maybe knowing that could help you figure out what's the problem.
Thanks in advance!
Posts: 6,348
Threads: 24
Joined: Jun 2017
Reputation:
400
Obi Owner:
22-02-2018, 08:20 PM
(This post was last modified: 22-02-2018, 08:22 PM by josemendez.)
(22-02-2018, 07:50 PM)Cannias Wrote: Hi josemendez,
I did what you told me to do. It's now obiRope.UsedParticles-1. As you can see in this video, it works perfect for 6 particles (as Rope Length). But less than 6 particles, the rope behaves different which i couldn't understand. And for greater than 6 particles, it behaves exact same as 7 particles rope. I'm going out of my mind, help please
P.S. I have a prefab which contains the obiRope, WhiteSphere and the BlackSphere. As in prefab, spheres are pinned to the ends of the rope. And I have a script called MovePin. So the moving spheres with mouse, changing rope length due to distance between two spheres, changing rope UV scale and snapping rope ends to the block stuffs are made in MovePin script. And i have the script on both of spheres and each one works for itself. Maybe knowing that could help you figure out what's the problem.
Thanks in advance!
Hi,
If you're changing the rope lenght at runtime using ObiRopeCursor, keep in mind that you're adding particles mid-rope (or wherever the cursor is). So of course the most recently added particle is not at the end or the beginning of the rope!. UsedParticles-1 will become the most recently added particle, not the one at the end.
What you need to do if you always want to get the first and last particle indices in a dynamically resized rope is to work with segments (distance constraints). They are always consecutive, the first particle in the first distance constraint will always be the particle at the beginning of the rope, and the last particle in the last distance constraint will be the particle at the end of the rope.
Code: ObiDistanceConstraintBatch batch = rope.DistanceConstraints.GetFirstBatch(); // or GetBatches()[0] for pre-3.3
int firstParticle = batch.springIndices[0];
int lastParticle = batch.springIndices[batch.springIndices.Count-1];
Posts: 8
Threads: 4
Joined: Feb 2018
Reputation:
0
(22-02-2018, 08:20 PM)josemendez Wrote: Hi,
If you're changing the rope lenght at runtime using ObiRopeCursor, keep in mind that you're adding particles mid-rope (or wherever the cursor is). So of course the most recently added particle is not at the end or the beginning of the rope!. UsedParticles-1 will become the most recently added particle, not the one at the end.
What you need to do if you always want to get the first and last particle indices in a dynamically resized rope is to work with segments (distance constraints). They are always consecutive, the first particle in the first distance constraint will always be the particle at the beginning of the rope, and the last particle in the last distance constraint will be the particle at the end of the rope.
Code: ObiDistanceConstraintBatch batch = rope.DistanceConstraints.GetFirstBatch(); // or GetBatches()[0] for pre-3.3
int firstParticle = batch.springIndices[0];
int lastParticle = batch.springIndices[batch.springIndices.Count-1];
i love you! i love you! i love you! i love you! i love you! i love you! i love you! i love you! i love you! i love you! i love you!
thank you sooooooooooooooooooooooooooooooooooooooooooooo muuchhhhhh!!!!!
|