
I've downloaded the Unity3D Farseer extension, and I'm looking to tweak the pulley joint. Right now the pulley joint acts like two distance joints essentially forcing a constant distance. I would like the two joints of the pulley to act like rope joints,
only enforcing a max distance but allowing the objects to move freely anywhere below that max distance. I'll include the function that I think I need to tweak below, and I really appreciate any help. Thanks a ton!
//This is within the PulleyJoint.cs class
internal override bool SolvePositionConstraints(ref SolverData data)
{
FVector2 cA = data.positions[m_indexA].c;
float aA = data.positions[m_indexA].a;
FVector2 cB = data.positions[m_indexB].c;
float aB = data.positions[m_indexB].a;
Rot qA = new Rot(aA), qB = new Rot(aB);
FVector2 rA = MathUtils.Mul(qA, LocalAnchorA  m_localCenterA);
FVector2 rB = MathUtils.Mul(qB, LocalAnchorB  m_localCenterB);
// Get the pulley axes.
FVector2 uA = cA + rA  GroundAnchorA;
FVector2 uB = cB + rB  GroundAnchorB;
float lengthA = uA.Length();
float lengthB = uB.Length();
if (lengthA > 10.0f * Settings.LinearSlop)
{
uA *= 1.0f / lengthA;
}
else
{
uA = FVector2.Zero;
}
if (lengthB > 10.0f * Settings.LinearSlop)
{
uB *= 1.0f / lengthB;
}
else
{
uB = FVector2.Zero;
}
// Compute effective mass.
float ruA = MathUtils.Cross(rA, uA);
float ruB = MathUtils.Cross(rB, uB);
float mA = m_invMassA + m_invIA * ruA * ruA;
float mB = m_invMassB + m_invIB * ruB * ruB;
float mass = mA + Ratio * Ratio * mB;
if (mass > 0.0f)
{
mass = 1.0f / mass;
}
float C = m_constant  lengthA  Ratio * lengthB;
float linearError = Math.Abs(C);
float impulse = mass * C;
FVector2 PA = impulse * uA;
FVector2 PB = Ratio * impulse * uB;
cA += m_invMassA * PA;
aA += m_invIA * MathUtils.Cross(rA, PA);
cB += m_invMassB * PB;
aB += m_invIB * MathUtils.Cross(rB, PB);
data.positions[m_indexA].c = cA;
data.positions[m_indexA].a = aA;
data.positions[m_indexB].c = cB;
data.positions[m_indexB].a = aB;
return linearError < Settings.LinearSlop;
}

