示例#1
0
文件: Heading.cs 项目: ylyking/lynea
    public bool IsFutureOf(Heading old)
    {
        if(old == null)
            return false;
        //time elapsed between this heading and the old one
        float elapsed = (float)(GetTime() - old.GetTime())/1000.0f;
        float elapsed2 = 0;
        if(old.IsAccelerating())
        {
            //time elasped while accelerating from old.speed to old.endSpeed
            elapsed = Math.Min(elapsed, (float)old.GetAccelerationTime()/1000.0f);
            //time elapsed while moving at constant speed with magnitude equal to endSpeed
            elapsed2 = Math.Max(elapsed - (float)old.GetAccelerationTime()/1000.0f, 0);
        }

        //compute the expected future state of the old heading
        Vector3 expectedPosition = old.GetPosition() + old.GetSpeed() * elapsed + 0.5f * old.GetAcceleration() * Convert.ToSingle(Math.Pow(elapsed, 2));
        expectedPosition += (elapsed2 * old.GetEndSpeed());
        Vector3 expectedSpeed = old.GetSpeed()+ old.GetAcceleration() * elapsed;
        float expectedAngle = old.GetAngle();

        float dp= Vector3.Distance(expectedPosition, position);
        float ds = Vector3.Distance(expectedSpeed, GetSpeed());
        float da =  AngleDistance(expectedAngle, angle);

        if(dp <  0.05 && ds < 0.05 && da < 0.05)
            return true;
        /*Debug.Log("NOT FUTURE");
        Debug.Log("PAST->EXP. FUTURE: -- pos:"+old.GetPosition()+"->"+expectedPosition+", s:"+old.GetSpeed()+"->"+expectedSpeed+", a:"+old.GetAngle()+"->"+expectedAngle+";old is accel?"+old.IsAccelerating());
        Debug.Log("REAL FUTURE: -- pos:"+"  "+"->"+position+", s:"+"  "+"->"+GetSpeed()+", a:"+"  "+"->"+GetAngle()+", accel?"+IsAccelerating());
        Debug.Log("|---> :dpos,ds,da= "+dp+", "+ds+", "+da+".");
        Debug.Log("expectedSpeed = "+expectedSpeed+" = s_0+a*t_a = "+old.GetSpeed()+"+"+old.GetAcceleration()+"*"+elapsed);
        Debug.Log("accelTime = "+old.GetAccelerationTime()+", s= "+ GetSpeed()+", ds= "+ds);
        */
        return false;
    }
示例#2
0
    private void UpdateView(Heading heading)
    {
        //amount of time since starting this heading
        float elapsed = (float)(ServerClock.Instance.GetTime() - heading.GetTime())/1000.0f;
        if (elapsed <0)
            return;
        //x, z position
        float x = heading.GetPosition().x + heading.GetSpeed().x * elapsed + 0.5f * heading.GetAcceleration().x * Convert.ToSingle(Math.Pow(elapsed, 2));
        float z = heading.GetPosition().z + heading.GetSpeed().z * elapsed + 0.5f * heading.GetAcceleration().z * Convert.ToSingle(Math.Pow(elapsed, 2));

        float angle = heading.GetAngle();
        if(heading == interceptor && softAngleVariation)
            angle = view.GetAngle();

        float speed = heading.GetSpeed().magnitude;
        if (heading.IsAccelerating()) {
            int sign  = (Vector3.Dot(heading.GetAcceleration(), heading.GetSpeed())) > 0 ? 1 : -1;
            speed += sign*heading.GetAcceleration().magnitude * elapsed;
        }

        //copy properties to the view heading
        view.InitFromValues(new Vector3(x, 0, z), angle, ServerClock.Instance.GetTime(), speed);
    }