示例#1
0
    static int IntToEnum(IntPtr L)
    {
        int arg0            = (int)LuaDLL.lua_tonumber(L, 1);
        JointLimitState2D o = (JointLimitState2D)arg0;

        LuaScriptMgr.PushEnum(L, o);
        return(1);
    }
    // Update is called once per frame
    void Update()
    {
        JointLimitState2D limitState = sliderJ.limitState;

        if (limitState == JointLimitState2D.LowerLimit)
        {
            ApplyMotorSpeed(movSpeed);
        }
        else if (limitState == JointLimitState2D.UpperLimit)
        {
            ApplyMotorSpeed(-movSpeed);
        }
    }
示例#3
0
        internal P2DSliderJoint(Rigidbody2DExt bodyA, Rigidbody2DExt bodyB, Vector2 localAnchorA, Vector2 localAnchorB, Vector2 axis)
            : base(bodyA, bodyB)
        {
            _jointType = JointType.Slider;

            _localAnchorA = localAnchorA;
            _localAnchorB = localAnchorB;

            SetAxis(axis);

            m_LocalYAxisA  = MathUtils.Cross(1.0f, localXAxisA);
            referenceAngle = -Mathf.DeltaAngle(bodyB.rotation, bodyA.rotation) * Mathf.Deg2Rad;

            m_LimitState = JointLimitState2D.Inactive;
        }
示例#4
0
        internal override void InitVelocityConstraints()
        {
            m_LocalCenterA = _bodyA.centerOfMass;
            m_LocalCenterB = _bodyB.centerOfMass;
            m_InvMassA     = _bodyA._invMass;
            m_InvMassB     = _bodyB._invMass;
            m_InvIA        = _bodyA._invI;
            m_InvIB        = _bodyB._invI;

            Vector2 cA = _bodyA.GetRelativePoint(m_LocalCenterA);
            float   aA = _bodyA.rotation * Mathf.Deg2Rad;
            Vector2 vA = _bodyA.velocity;
            float   wA = _bodyA.angularVelocity * Mathf.Deg2Rad;

            Vector2 cB = _bodyB.GetRelativePoint(m_LocalCenterB);
            float   aB = _bodyB.rotation * Mathf.Deg2Rad;
            Vector2 vB = _bodyB.velocity;
            float   wB = _bodyB.angularVelocity * Mathf.Deg2Rad;

            Rot qA = new Rot(aA), qB = new Rot(aB);

            Vector2 rA = MathUtils.Mul(qA, _localAnchorA - m_LocalCenterA);
            Vector2 rB = MathUtils.Mul(qB, _localAnchorB - m_LocalCenterB);

            float mA = m_InvMassA, mB = m_InvMassB;
            float iA = m_InvIA, iB = m_InvIB;

            Vector2 d = (cB - cA) + rB - rA;

            // Compute motor Jacobian and effective mass.
            {
                m_Axis = MathUtils.Mul(qA, localXAxisA);
                m_A1   = MathUtils.Cross(d + rA, m_Axis);
                m_A2   = MathUtils.Cross(rB, m_Axis);

                m_MotorMass = mA + mB + iA * m_A1 * m_A1 + iB * m_A2 * m_A2;
                if (m_MotorMass > 0.0f)
                {
                    m_MotorMass = 1.0f / m_MotorMass;
                }
            }

            // Prismatic constraint.
            {
                m_Perp = MathUtils.Mul(qA, m_LocalYAxisA);

                m_S1 = MathUtils.Cross(d + rA, m_Perp);
                m_S2 = MathUtils.Cross(rB, m_Perp);

                float k11 = mA + mB + iA * m_S1 * m_S1 + iB * m_S2 * m_S2;
                float k12 = iA * m_S1 + iB * m_S2;
                float k13 = iA * m_S1 * m_A1 + iB * m_S2 * m_A2;
                float k22 = iA + iB;
                if (k22 == 0.0f)
                {
                    // For bodies with fixed rotation.
                    k22 = 1.0f;
                }
                float k23 = iA * m_A1 + iB * m_A2;
                float k33 = mA + mB + iA * m_A1 * m_A1 + iB * m_A2 * m_A2;

                m_K.ex = new Vector3(k11, k12, k13);
                m_K.ey = new Vector3(k12, k22, k23);
                m_K.ez = new Vector3(k13, k23, k33);
            }

            // Get joint translation
            m_Translation = Vector2.Dot(m_Axis, d);

            // Compute motor and limit terms.
            if (m_EnableLimit)
            {
                float jointTranslation = m_Translation;
                if (Mathf.Abs(m_UpperTranslation - m_LowerTranslation) < 2.0f * Constants.linearSlop)
                {
                    m_LimitState = JointLimitState2D.EqualLimits;
                }
                else if (jointTranslation <= m_LowerTranslation)
                {
                    if (m_LimitState != JointLimitState2D.LowerLimit)
                    {
                        m_LimitState = JointLimitState2D.LowerLimit;
                        m_Impulse.z  = 0.0f;
                    }
                }
                else if (jointTranslation >= m_UpperTranslation)
                {
                    if (m_LimitState != JointLimitState2D.UpperLimit)
                    {
                        m_LimitState = JointLimitState2D.UpperLimit;
                        m_Impulse.z  = 0.0f;
                    }
                }
                else
                {
                    m_LimitState = JointLimitState2D.Inactive;
                    m_Impulse.z  = 0.0f;
                }
            }
            else
            {
                m_LimitState = JointLimitState2D.Inactive;
            }

            if (m_EnableMotor == false)
            {
                m_MotorImpulse = 0.0f;
            }

            // TODO: Account for variable time step.
            // m_Impulse *= data.step.dtRatio;
            // m_MotorImpulse *= data.step.dtRatio;

            Vector2 P  = m_Impulse.x * m_Perp + (m_MotorImpulse + m_Impulse.z) * m_Axis;
            float   LA = m_Impulse.x * m_S1 + m_Impulse.y + (m_MotorImpulse + m_Impulse.z) * m_A1;
            float   LB = m_Impulse.x * m_S2 + m_Impulse.y + (m_MotorImpulse + m_Impulse.z) * m_A2;

            vA -= mA * P;
            wA -= iA * LA;

            vB += mB * P;
            wB += iB * LB;

            if (!_bodyA.isKinematic)
            {
                _bodyA.velocity = vA;
                if (!_bodyA.fixedAngle)
                {
                    _bodyA.angularVelocity = wA * Mathf.Rad2Deg;
                }
            }
            if (!_bodyB.isKinematic)
            {
                _bodyB.velocity = vB;
                if (!_bodyB.fixedAngle)
                {
                    _bodyB.angularVelocity = wB * Mathf.Rad2Deg;
                }
            }
        }