public FinePoint CaculateOneFinePoint(Vector3 startPosition, Vector2 startRotation, int step, float dt) { FinePoint point = new FinePoint(); if (step < 0 || dt < 0) { return(point); } if (step >= 0 && step < mControlPoints.Length) { float rXDelta = dt * mControlPoints[step].mRotationChange.x / mControlPoints[step].mTime; float rYDelta = dt * mControlPoints[step].mRotationChange.y / mControlPoints[step].mTime; startRotation.x += rXDelta; startRotation.y += rYDelta; } step = Mathf.Min(step, mControlPoints.Length - 1); rotatedVec = MathUtil.GetInstance().Rotate(Vector3.forward, startRotation.x, startRotation.y); Vector3 dL = dt * mBaseSpeed * rotatedVec * mControlPoints[step].mSpeedScale; startPosition += dL; point.position = startPosition; point.rotation = startRotation; point.controlIndex = step; return(point); }
public FinePoint CaculateOneFinePoint1(Vector2 startPosition, float startRotation, int step, float dt, bool log = true) { FinePoint point = new FinePoint(); point.position = startPosition; point.rotation = startRotation; point.controlIndex = step; if (step < 0 || dt <= 0) { return(point); } if (step >= 0 && step < mControlPoints.Length) { float rDelta = dt * mControlPoints[step].mRotationChange / mControlPoints[step].mTime; startRotation -= rDelta; } step = Mathf.Min(step, mControlPoints.Length - 1); rotatedVec = MathUtil.GetInstance().Rotate(Vector2.right, startRotation); Vector2 dL = dt * mBaseSpeed * rotatedVec * mControlPoints[step].speedFactor; startPosition += dL; point.position = startPosition; point.rotation = startRotation; point.controlIndex = step; //if (Application.isPlaying && log) //Debug.Log(startPosition.ToString() + " " + string.Format("{0:.000}", (startRotation - 360))); return(point); }
public FinePoint CaculateOneFinePoint(Vector2 startPosition, float startRotation, int step, float dt, bool log = true) { FinePoint point = new FinePoint(); point.position = startPosition; point.rotation = startRotation; point.controlIndex = step; if (step < 0 || dt <= 0) { return(point); } if (step >= 0 && step < mControlPoints.Length) { float rDelta = dt * mControlPoints[step].mRotationChange / mControlPoints[step].mTime; startRotation -= rDelta; } step = Mathf.Min(step, mControlPoints.Length - 1); rotatedVec = MathUtil.GetInstance().Rotate(Vector2.right, startRotation); Vector2 dL = dt * mBaseSpeed * rotatedVec * mControlPoints[step].speedFactor; //Debug.Log(mControlPoints[step].speedFactor); startPosition += dL; point.position = startPosition; point.rotation = startRotation; point.controlIndex = step; return(point); }
// Use this for initialization void Start() { oneFinePoint = new FinePoint(); oneFinePoint.position = transform.localPosition; oneFinePoint.rotation = transform.eulerAngles.z; mFishPath.CaculateFinePoints(transform); #if FishPath_3D Animation anim = GetComponent <Animation>(); foreach (AnimationState state in anim) { if (FishKindId != 2) { state.speed = mSpeed / 50.0f; } state.time = Random.Range(0, 2f); if (state.name.Contains("catch")) { AnimationEvent animevent = new AnimationEvent(); animevent.functionName = "DeadCallback"; animevent.intParameter = mFishRecord.id; animevent.time = state.length; state.clip.AddEvent(animevent); } } #endif }
public void CaculateTransform(int step, float dt) { if (dt <= 0) { return; } Vector2 vec2Pos = new Vector2(transform.localPosition.x, transform.localPosition.y); oneFinePoint = mFishPath.CaculateOneFinePoint1(vec2Pos, transform.eulerAngles.z, step, dt); transform.localPosition = oneFinePoint.position; transform.eulerAngles = new Vector3(0, 0, oneFinePoint.rotation); }
public void CaculateFinePoints() { if (Application.isEditor == false) { return; } mFinePointsList.Clear(); float time = 0; mCurrentFinePoint.position = mStartPosition; mCurrentFinePoint.rotation = mStartRotation; mCurrentFinePoint.controlIndex = 0; mFinePointsList.Add(mCurrentFinePoint); rotatedVec = Vector3.forward; mCurrentLife = 0; mLastFrameLife = 0; mLastFrameStep = mCurrentStep = 0; float totaltime = GetTotalTime(); while (time < totaltime) { time += SECOND_ONE_FRAME; mLastFrameLife = mCurrentLife; mCurrentLife += SECOND_ONE_FRAME; mStepTime = 0; for (int i = 0; i < mControlPoints.Length; i++) { mStepTime += mControlPoints[i].mTime; if (mCurrentLife <= mStepTime) { mCurrentStep = i; break; } else { mCurrentStep = mControlPoints.Length; } } if (mLastFrameStep != mCurrentStep) { int tmpStep = mLastFrameStep; float t1 = mLastFrameLife; while (true) { tmpStep = tmpStep + 1; if (tmpStep > mCurrentStep) { break; } float t2 = 0; for (int i = 0; i < tmpStep; i++) { t2 += mControlPoints[i].mTime; } float dt1 = t2 - t1; t1 = t2; int cnt1 = Mathf.FloorToInt(dt1 / SECOND_ONE_FRAME); for (int i = 0; i < cnt1; i++) { mCurrentFinePoint = CaculateOneFinePoint(mCurrentFinePoint.position, mCurrentFinePoint.rotation, tmpStep - 1, SECOND_ONE_FRAME); mFinePointsList.Add(mCurrentFinePoint); } mCurrentFinePoint = CaculateOneFinePoint(mCurrentFinePoint.position, mCurrentFinePoint.rotation, tmpStep - 1, dt1 - SECOND_ONE_FRAME * cnt1); mFinePointsList.Add(mCurrentFinePoint); } float t3 = 0; for (int i = 0; i < mCurrentStep; i++) { t3 += mControlPoints[i].mTime; } float dt2 = mCurrentLife - t3; int cnt2 = Mathf.FloorToInt(dt2 / SECOND_ONE_FRAME); for (int i = 0; i < cnt2; i++) { mCurrentFinePoint = CaculateOneFinePoint(mCurrentFinePoint.position, mCurrentFinePoint.rotation, mCurrentStep, SECOND_ONE_FRAME); mFinePointsList.Add(mCurrentFinePoint); } mCurrentFinePoint = CaculateOneFinePoint(mCurrentFinePoint.position, mCurrentFinePoint.rotation, mCurrentStep, dt2 - SECOND_ONE_FRAME * cnt2); mFinePointsList.Add(mCurrentFinePoint); mLastFrameStep = mCurrentStep; } else { mCurrentFinePoint = CaculateOneFinePoint(mCurrentFinePoint.position, mCurrentFinePoint.rotation, mCurrentStep, SECOND_ONE_FRAME); mFinePointsList.Add(mCurrentFinePoint); } } }
public void CaculateFinePoints(Transform trans = null) { if (Application.isEditor == false) { return; } if (trans) { Vector2 vec2Pos = new Vector2(trans.localPosition.x, trans.localPosition.y); StartPosition = vec2Pos; StartRotation = trans.eulerAngles.z; } mFinePointsList.Clear(); float time = 0; mCurrentFinePoint.position = mStartPosition; mCurrentFinePoint.rotation = mStartRotation; mCurrentFinePoint.controlIndex = 0; mFinePointsList.Add(mCurrentFinePoint); rotatedVec = Vector2.right; mCurrentLife = 0; mLastFrameLife = 0; mLastFrameStep = mCurrentStep = 0; float totaltime = GetTotalTime(); this.CaculateSpeedAndRotateFactor(); while (time < totaltime) { time += SECOND_ONE_FRAME; mLastFrameLife = mCurrentLife; mCurrentLife += SECOND_ONE_FRAME; mStepTime = 0; for (int i = 0; i < mControlPoints.Length; i++) { mStepTime += mControlPoints[i].mTime; if (mCurrentLife <= mStepTime) { mCurrentStep = i; break; } else { mCurrentStep = mControlPoints.Length; } } if (mLastFrameStep != mCurrentStep) { int tmpStep = mLastFrameStep; float t1 = mLastFrameLife; while (true) { tmpStep = tmpStep + 1; if (tmpStep > mCurrentStep) { break; } float t2 = 0; for (int i = 0; i < tmpStep; i++) { t2 += mControlPoints[i].mTime; } float dt1 = t2 - t1; t1 = t2; int cnt1 = Mathf.FloorToInt(dt1 / SECOND_ONE_FRAME); for (int i = 0; i < cnt1; i++) { mCurrentFinePoint = CaculateOneFinePoint(mCurrentFinePoint.position, mCurrentFinePoint.rotation, tmpStep - 1, SECOND_ONE_FRAME, false); mFinePointsList.Add(mCurrentFinePoint); } mCurrentFinePoint = CaculateOneFinePoint(mCurrentFinePoint.position, mCurrentFinePoint.rotation, tmpStep - 1, dt1 - SECOND_ONE_FRAME * cnt1, false); mFinePointsList.Add(mCurrentFinePoint); } float t3 = 0; for (int i = 0; i < mCurrentStep; i++) { t3 += mControlPoints[i].mTime; } float dt2 = mCurrentLife - t3; int cnt2 = Mathf.FloorToInt(dt2 / SECOND_ONE_FRAME); for (int i = 0; i < cnt2; i++) { mCurrentFinePoint = CaculateOneFinePoint(mCurrentFinePoint.position, mCurrentFinePoint.rotation, mCurrentStep, SECOND_ONE_FRAME, false); mFinePointsList.Add(mCurrentFinePoint); } mCurrentFinePoint = CaculateOneFinePoint(mCurrentFinePoint.position, mCurrentFinePoint.rotation, mCurrentStep, dt2 - SECOND_ONE_FRAME * cnt2, false); mFinePointsList.Add(mCurrentFinePoint); mLastFrameStep = mCurrentStep; } else { mCurrentFinePoint = CaculateOneFinePoint(mCurrentFinePoint.position, mCurrentFinePoint.rotation, mCurrentStep, SECOND_ONE_FRAME, false); mFinePointsList.Add(mCurrentFinePoint); } } foreach (FinePoint p in mFinePointsList) { p.position.x = p.position.x - 640; p.position.y = p.position.y - 360; } //string resultFile = Application.dataPath + "/FishPath/Resources/PathConfig/test.txt"; //FileStream fs1 = new FileStream(resultFile, FileMode.Create, FileAccess.Write); //StreamWriter sw = new StreamWriter(fs1); //int index = 0; //foreach (FinePoint p in mFinePointsList) //{ // string str = index + " " + p.position.ToString() + " " + p.rotation.ToString(); // sw.WriteLine(str); // index++; //} //sw.Flush(); //fs1.Close(); }
public void CaculateTransform(int step, float dt) { oneFinePoint = mFishPath.CaculateOneFinePoint(transform.localPosition, transform.eulerAngles, step, dt); transform.localPosition = oneFinePoint.position; transform.eulerAngles = oneFinePoint.rotation; }