This project has moved and is read-only. For the latest updates, please go here.

# Need help Adjusting the Pulley Joint

 Topics: Developer Forum, Project Management Forum, User Forum Wiki Link: [discussion:568502]
 EvanBarmes Sep 27, 2014 at 3:52 PM 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; }``````