Example #1
0
    private void UpdateJointTransform(float t)
    {
        // FK
        if (m_bvhLoaded)
        {
            FKIKPlugin.UpdateBVHSkeleton(m_id, t);
            FKIKPlugin.GetJointData(m_id, m_jointDataArray, m_joints.Count);
        }
        else
        {
            FKIKPlugin.UpdateSkeleton(m_id);
            FKIKPlugin.GetJointData(m_id, m_jointDataArray, m_joints.Count);
        }
        ApplyJointDataArray();

        // Check foot-ground contact
        CheckFootGroundContact();

        // IK
        if (m_enableFootIK)
        {
            FootIK();
        }
    }
Example #2
0
    private void FootIK()
    {
        // Get foot position in world space
        Vector3 leftFootPos  = m_leftFoot.transform.position;
        Vector3 rightFootPos = m_rightFoot.transform.position;

        /// C++ Implementation
        RaycastFootHeight(leftFootPos, out float leftHeight, out Vector3 leftNormal);
        RaycastFootHeight(rightFootPos, out float rightHeight, out Vector3 rightNormal);
        FKIKPlugin.SolveFootIK(m_id, leftHeight, rightHeight, m_leftFootGroundContact, m_rightFootGroundContact,
                               FKIKPlugin.UnityToBVHTranslation(leftNormal), FKIKPlugin.UnityToBVHTranslation(rightNormal));

        FKIKPlugin.GetJointData(m_id, m_jointDataArray, m_joints.Count);
        ApplyJointDataArray();

        /// Unity Implementation

        //if (RaycastFootHeight(leftFootPos, out float leftHeight, out Vector3 leftNormal))
        //{
        //    leftFootPos.y = Mathf.Lerp(leftHeight + leftFootPos.y, m_lastLeftFootY, m_footSpeedY);
        //}
        //if (RaycastFootHeight(rightFootPos, out float rightHeight, out Vector3 rightNormal))
        //{
        //    rightFootPos.y = Mathf.Lerp(rightHeight + rightFootPos.y, m_lastRightFootY, m_footSpeedY);
        //}

        //m_lastLeftFootY = leftFootPos.y;
        //m_lastRightFootY = rightFootPos.y;
        //// Transform to guide space
        //leftFootPos = gameObject.transform.InverseTransformPoint(leftFootPos); // World space to guide space
        //rightFootPos = gameObject.transform.InverseTransformPoint(rightFootPos); // World space to guide space

        //// Move root height
        //float rootOffsetY = leftFootPos.y < rightFootPos.y ? leftHeight : rightHeight;
        //rootOffsetY = Mathf.Lerp(m_lastRootOffsetY, rootOffsetY, m_rootSpeedY);
        //m_lastRootOffsetY = rootOffsetY;
        //Vector3 rootPos = m_root.transform.position + new Vector3(0, rootOffsetY, 0);
        //rootPos = gameObject.transform.InverseTransformPoint(rootPos);

        //FKIKPlugin.SetRootJointTranslation(m_id, FKIKPlugin.UnityToBVHTranslation(rootPos));
        //FKIKPlugin.UpdateSkeleton(m_id);
        //FKIKPlugin.SolveLimbIK(m_id, FindIdByJoint(m_leftFoot), FKIKPlugin.UnityToBVHTranslation(leftFootPos));
        //FKIKPlugin.SolveLimbIK(m_id, FindIdByJoint(m_rightFoot), FKIKPlugin.UnityToBVHTranslation(rightFootPos));
        //FKIKPlugin.GetJointData(m_id, m_jointDataArray, m_joints.Count);

        //ApplyJointDataArray();

        //// Foot rotation
        //if (m_leftFootGroundContact)
        //{
        //    Vector3 leftForward = Vector3.Cross(m_leftFoot.transform.right, leftNormal); // Calculate new forward vector
        //    m_leftFoot.transform.up = leftNormal;
        //    m_leftFoot.transform.forward = leftForward;
        //}
        //if (m_rightFootGroundContact)
        //{
        //    Vector3 rightForward = Vector3.Cross(m_rightFoot.transform.right, rightNormal);
        //    m_rightFoot.transform.up = rightNormal;
        //    m_rightFoot.transform.forward = rightForward;
        //}
    }