Ejemplo n.º 1
0
    public bool DoSimulate(int sector, IM.Vector2 angleAdjustment, IM.Number speed, ShootSolution.AnimationType type, IM.Number reductionIndex, ref ShootSolution solution)
    {
        if (sector == -1)
        {
            return(false);
        }

        IM.Vector3 vecInitPos, vecInitVel;
        IM.Vector3 vecFinPos, vecFinVel;

        /*
         * if(sector == 0)
         * {
         *      vecInitPos = m_basket.m_rim.center;
         *      vecInitVel = new IM.Vector3(0.0f, 0.0f, 1.0f);
         *
         *      vecInitVel = Quaternion.AngleAxis(m_fBeta, IM.Vector3.up) * vecInitVel;
         *      vecInitVel = Quaternion.AngleAxis(m_fAlpha, IM.Vector3.Cross(vecInitVel.normalized, IM.Vector3.up)) * vecInitVel;
         *
         *      vecInitVel.Normalize();
         *      vecInitVel *= m_fVel_ini;
         * }
         * else
         */
        {
            vecInitPos   = m_ball.position;
            vecInitVel   = m_basket.m_rim.center - vecInitPos;
            vecInitVel.y = IM.Number.zero;

            vecInitVel = IM.Quaternion.AngleAxis(angleAdjustment.x, IM.Vector3.up) * vecInitVel;
            vecInitVel = IM.Quaternion.AngleAxis(angleAdjustment.y, IM.Vector3.Cross(vecInitVel.normalized, IM.Vector3.up)) * vecInitVel;

            vecInitVel.Normalize();
            vecInitVel *= speed;
        }
        solution.m_vInitPos  = vecInitPos;
        solution.m_vInitVel  = vecInitVel;
        solution.m_vFinPos   = vecInitPos;
        solution.m_vFinVel   = vecInitVel;
        solution.m_vStartPos = vecInitPos;

        _Simulating(vecInitPos, vecInitVel, type, reductionIndex, ref solution);

        vecInitPos = solution.m_vInitPos;
        vecFinPos  = solution.m_vFinPos;
        vecFinVel  = solution.m_vFinVel;

        return(true);
    }
Ejemplo n.º 2
0
    public override void OnInspectorGUI()
    {
        if (m_basket == null || m_ball == null)
        {
            return;
        }

        EditorGUILayout.BeginHorizontal();
        EditorGUILayout.PrefixLabel("Sector: ");
        m_iCurSector = GameSystem.Instance.shootSolutionManager.CalcSectorIdx(m_basket.m_rim.center, m_ball.position);
        EditorGUILayout.IntField(m_iCurSector);
        EditorGUILayout.EndHorizontal();

        EditorGUILayout.BeginHorizontal();
        type = (ShootSolution.AnimationType)EditorGUILayout.EnumPopup("Animation type:", type);
        EditorGUILayout.EndHorizontal();

        EditorGUILayout.BeginHorizontal();
        EditorGUILayout.PrefixLabel("Animation play time: ");
        m_playTime = EditorGUILayout.FloatField(m_playTime);
        EditorGUILayout.EndHorizontal();

        EditorGUILayout.BeginHorizontal();
        EditorGUILayout.PrefixLabel("Animation play speed: ");
        m_playSpeed = EditorGUILayout.FloatField(m_playSpeed);
        EditorGUILayout.EndHorizontal();

        EditorGUILayout.BeginHorizontal();
        EditorGUILayout.PrefixLabel("Animation Redunction index: ");
        m_reductionIndex = EditorGUILayout.FloatField(m_reductionIndex);
        EditorGUILayout.EndHorizontal();

        /*
         * Vector3 dirBall2BasketH = (mBasket.m_rim.center - mBall.transform.position).normalized;
         * dirBall2BasketH.y = 0.0f;
         *
         * Vector3 dirInitVel = mCurSelectedSolution.m_vInitVel.normalized;
         * Vector3 dirInitVelH = dirInitVel;
         * dirInitVelH.y = 0.0f;
         * float fAlpha = Vector3.Angle(dirInitVelH, dirInitVel);
         * float fBeta =  Vector3.Cross(dirInitVelH, dirBall2BasketH).y > 0.0f ? Vector3.Angle(dirInitVelH, dirBall2BasketH) : -Vector3.Angle(dirInitVelH, dirBall2BasketH);
         * float fVel_ini = mCurSelectedSolution.m_vInitVel.magnitude;
         */

        EditorGUILayout.BeginHorizontal();
        //m_simulating = GUILayout.Toggle( m_simulating, "Simulate", GUILayout.ExpandWidth(true) );
        if (GUILayout.Button("Simulate", GUILayout.Height(20f)))
        {
            Dosimulating();
        }
        bool mirrorClicked = GUILayout.Button("Mirror", GUILayout.ExpandWidth(true));

        EditorGUILayout.EndHorizontal();

        EditorGUILayout.BeginHorizontal();
        EditorGUILayout.PrefixLabel("Shoot angle alpha: ");
        m_vAngleAdjustment.y = EditorGUILayout.Slider(m_vAngleAdjustment.y, 0.0f, 90.0f);
        EditorGUILayout.EndHorizontal();

        //path name:
        EditorGUILayout.BeginHorizontal();
        EditorGUILayout.PrefixLabel("Shoot angle beta: ");
        m_vAngleAdjustment.x = EditorGUILayout.Slider(m_vAngleAdjustment.x, -180f, 180f);
        EditorGUILayout.EndHorizontal();

        EditorGUILayout.BeginHorizontal();
        EditorGUILayout.PrefixLabel("Shoot vel: ");
        m_fSpeed = EditorGUILayout.Slider(m_fSpeed, 0.0f, 20.0f);
        EditorGUILayout.EndHorizontal();

        EditorGUILayout.BeginHorizontal();
        m_vBounceRimAdjustment = EditorGUILayout.Vector3Field("Bounce rim dir adjustment:", m_vBounceRimAdjustment);
        EditorGUILayout.EndHorizontal();

        EditorGUILayout.BeginHorizontal();
        EditorGUILayout.PrefixLabel("Bounce backboard: ");
        m_fBounceBackboard = EditorGUILayout.Slider(m_fBounceBackboard, 0.0f, 2.0f);
        EditorGUILayout.EndHorizontal();

        EditorGUILayout.BeginHorizontal();
        if (GUILayout.Button("Load solution set", GUILayout.ExpandWidth(true)))
        {
            string path = GlobalConst.DIR_XML_SHOOT_SOLUTION + "shootsolutionset";
            GameSystem.Instance.shootSolutionManager.LoadShootSolutionSet(path, true);
        }
        EditorGUILayout.EndHorizontal();

        EditorGUILayout.BeginHorizontal();
        if (GUILayout.Button("Solutions", GUILayout.ExpandWidth(true)))
        {
            EditorWindow.GetWindow <ShootSolutionEditor>(false, "ShootSolutionEditor", true).Show();
        }
        EditorGUILayout.EndHorizontal();

        //if(m_simulating)
        //{
        //    if (ShootSolutionEditor.instance != null && ShootSolutionEditor.instance.mCurSelectedSolution != null)
        //    {
        //        m_editingShootSolution = ShootSolutionEditor.instance.mCurSelectedSolution;
        //    }
        //    else
        //        m_editingShootSolution = m_simulatingShootSolution;

        //    if (mirrorClicked)
        //    {
        //        m_ball.transform.position = new Vector3(-m_ball.transform.position.x, m_ball.transform.position.y, m_ball.transform.position.z);
        //        m_vAngleAdjustment.x *= -1;
        //        m_editingShootSolution = m_editingShootSolution.Clone();
        //        ShootSolutionEditor.instance.mCurSelectedSolution = m_editingShootSolution;
        //    }
        //    m_iCurSector = GameSystem.Instance.shootSolutionManager.CalcSectorIdx(m_basket.m_rim.center, m_ball.transform.position);
        //    ShootSimulation.Instance.Build(m_basket, m_ball);

        //    m_editingShootSolution.m_vBounceRimAdjustment = m_vBounceRimAdjustment;
        //    m_editingShootSolution.m_fBounceBackboard = m_fBounceBackboard;

        //    m_editingShootSolution.m_animationType = type;
        //    m_editingShootSolution.m_playTime = m_playTime;
        //    m_editingShootSolution.m_playSpeed = m_playSpeed;

        //    if (!ShootSimulation.Instance.DoSimulate(m_iCurSector, m_vAngleAdjustment, m_fSpeed, type, ref m_editingShootSolution))
        //        return;

        //    m_shootSolutionKeys.Clear();
        //    if( m_editingShootSolution == null )
        //        return;

        //    float fTime = 0.0f;
        //    float fStep = 0.01f;
        //    Vector3 curPos;

        //    while( m_editingShootSolution.GetPosition(fTime, out curPos) )
        //    {
        //        m_shootSolutionKeys.Add(curPos);
        //        fTime += fStep;
        //    }

        //    m_ball.m_shootSolution = m_editingShootSolution;
        //    SceneView.RepaintAll();
        //}
    }
Ejemplo n.º 3
0
    bool _Simulating(IM.Vector3 vecInitPos, IM.Vector3 vecInitVel, ShootSolution.AnimationType type, IM.Number reductionIndex, ref ShootSolution solution)
    {
        solution.ClearCurve();

        ShootSolution.SShootCurve shootCurve = new ShootSolution.SShootCurve();
        int  iBoundCount = 0;
        bool bSuccess    = false;

        while (true)
        {
            IM.Vector3 vecFinVel;

            IM.Number fTime_Rim       = IM.Number.zero;
            IM.Number fTime_BackBoard = IM.Number.zero;
            IM.Number fTime_Ground    = IM.Number.zero;

            CalculateShootCurve(ref shootCurve, vecInitPos, vecInitVel);
            if (!_CheckCollision_Rim(shootCurve, ref fTime_Rim) || fTime_Rim < new IM.Number(0, 100))
            {
                fTime_Rim = new IM.Number(10000);
            }
            if (!_CheckCollision_BackBoard(shootCurve, ref fTime_BackBoard) || fTime_BackBoard < new IM.Number(0, 100))
            {
                fTime_BackBoard = new IM.Number(10000);
            }
            if (!_CheckCollision_Ground(shootCurve, ref fTime_Ground))
            {
                fTime_Ground = new IM.Number(10000);
            }

            //collide rim
            if (fTime_Rim < fTime_BackBoard && fTime_Rim < fTime_Ground)
            {
                shootCurve.fTime = fTime_Rim;
                //if (solution.m_animationType != ShootSolution.AnimationType.none)
                //    _DoCollision_Rim(solution.m_vBounceRimAdjustment * reductionIndex, shootCurve, fTime_Rim, ref vecInitPos, ref vecInitVel);
                //else
                _DoCollision_Rim(solution.m_vBounceRimAdjustment, shootCurve, fTime_Rim, ref vecInitPos, ref vecInitVel);

                if (_CheckShootSuccess(shootCurve, ref fTime_Rim))
                {
                    bSuccess = true;
                }

                iBoundCount++;
                solution.AddCurve(shootCurve.fTime, shootCurve.fX_a, shootCurve.fX_b, shootCurve.fX_c,
                                  shootCurve.fY_a, shootCurve.fY_b, shootCurve.fY_c, shootCurve.fZ_a, shootCurve.fZ_b, shootCurve.fZ_c);

                solution.m_vFinPos = vecInitPos;
                solution.m_vFinVel = vecInitVel;
            }
            //collide backboard
            else if (fTime_BackBoard < fTime_Rim && fTime_BackBoard < fTime_Ground)
            {
                shootCurve.fTime = fTime_BackBoard;

                iBoundCount++;
                _DoCollision_BackBoard(solution.m_fBounceBackboard, shootCurve, fTime_BackBoard, ref vecInitPos, ref vecInitVel);

                if (_CheckShootSuccess(shootCurve, ref fTime_BackBoard))
                {
                    bSuccess = true;
                }

                solution.AddCurve(shootCurve.fTime, shootCurve.fX_a, shootCurve.fX_b, shootCurve.fX_c,
                                  shootCurve.fY_a, shootCurve.fY_b, shootCurve.fY_c, shootCurve.fZ_a, shootCurve.fZ_b, shootCurve.fZ_c);

                solution.m_vFinPos = vecInitPos;
                solution.m_vFinVel = vecInitVel;
            }
            else
            {
                shootCurve.fTime = fTime_Ground;
                IM.Number fTime_Goal = IM.Number.zero;
                if (_CheckShootSuccess(shootCurve, ref fTime_Goal))
                {
                    Debug.Log("goal success");

                    bSuccess = true;
                    solution.AddCurve(fTime_Goal, shootCurve.fX_a, shootCurve.fX_b, shootCurve.fX_c,
                                      shootCurve.fY_a, shootCurve.fY_b, shootCurve.fY_c, shootCurve.fZ_a, shootCurve.fZ_b, shootCurve.fZ_c);

                    //goal in rim
                    vecFinVel    = solution.m_vFinVel;
                    vecFinVel.x *= new IM.Number(0, 100);
                    vecFinVel.y *= new IM.Number(0, 200);
                    vecFinVel.z *= new IM.Number(0, 100);

                    solution.m_vFinVel = vecFinVel;
                }
                else
                {
                    bSuccess = false;
                    solution.AddCurve(fTime_Ground, shootCurve.fX_a, shootCurve.fX_b, shootCurve.fX_c,
                                      shootCurve.fY_a, shootCurve.fY_b, shootCurve.fY_c, shootCurve.fZ_a, shootCurve.fZ_b, shootCurve.fZ_c);
                }

                /*
                 * else if(iBoundCount > 0)
                 * {
                 *      bSuccess = false;
                 *
                 *      vecFinVel = solution.m_vFinVel;
                 *      vecFinVel.x *= 0.5f;
                 *      vecFinVel.y *= 1.3f;
                 *      vecFinVel.z *= 0.5f;
                 *
                 *      solution.m_vFinVel = vecFinVel;
                 *      solution.AddCurve(fTime_Ground, shootCurve.fX_a, shootCurve.fX_b, shootCurve.fX_c,
                 *                            shootCurve.fY_a, shootCurve.fY_b, shootCurve.fY_c, shootCurve.fZ_a, shootCurve.fZ_b, shootCurve.fZ_c);
                 * }
                 */

                solution.m_bSuccess = bSuccess;
                break;
            }

            if (iBoundCount > 100)
            {
                Debug.Log("Invalid shoot solution: too many bounds.");
                //solution.ClearCurve();
                return(false);
            }

            if (shootCurve.fTime > new IM.Number(1000))
            {
                return(false);
            }
        }
        return(true);
    }