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); }
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(); //} }
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); }