コード例 #1
0
    /**
     * Move the player's position
     */
    public void Move(float forward, float turn, float duration, bool jump)
    {
        if (Controller == null)
        {
            return;
        }

        LegUpdate(forward);

        float bob_factor = 0f;

        if (walking != 0)
        {
            bob_factor = Mathf.Abs(left_leg.walk_seq_step) / 300f;
        }

        var resting = crouch_spring.stable_pos == crouch_spring.pos;

        crouch_spring.stable_pos = 0f + base_crouch_factor + (bob_factor * bob_amount);
        if (resting)
        {
            crouch_spring.pos = crouch_spring.stable_pos;
        }
        crouch_spring.calculate(duration);
        crouch_factor = Mathf.Round(Mathf.Clamp(crouch_spring.pos, -1.2f, 1.2f) * 100) / 100f;
        //crouch_factor = crouch_spring.pos;

        var temp = head.transform.localPosition;

        temp.z = head_rest_y - crouch_factor * crouch_dist;
        head.transform.localPosition = temp;

        var previous_pos = state.pos;

        JumpUpdate(jump, duration);

        state.on_ground = Controller.isGrounded;
        state.mass      = get_total_mass();
        InputTuple i = new InputTuple(forward, turn * 4f);

        state.integrate(Time.fixedTime, duration, i);

        transform.localEulerAngles = new Vector3(0, state.angle, 0);

        var tp = head.transform.position;

        tp.y -= .5f;
        Debug.DrawLine(tp, tp + (state.velocity * 100), Color.red);
        Debug.DrawLine(tp, tp + (state.accel * 10), Color.cyan);
        Debug.DrawLine(tp, tp + (state.momentum * .1f), Color.black);
        move = (previous_pos - state.pos);
        if (move.magnitude > .001)
        {
            Controller.Move(move * -1f);
        }
        //Controller.SimpleMove(state.velocity);
    }
コード例 #2
0
    private Derivative evaluate2(float t, float dt, Derivative d, InputTuple i)
    {
        var p = pos + (d.velocity * dt);
        var m = momentum + (d.force * dt);
        var a = angle + d.torque * dt;
        var s = new Integrator(mass, p, Vector3.zero, m, a);

        s.recalculate();
        return(new Derivative(s.velocity, acceleration(dt, i), torque(dt, i)));
    }
コード例 #3
0
    public void integrate(float t, float dt, InputTuple i)
    {
        var a = evaluate1(t, i);
        var b = evaluate2(t, dt * .05f, a, i);
        var c = evaluate2(t, dt * .05f, b, i);
        var d = evaluate2(t, dt, c, i);

        var factor  = 2f;
        var divisor = (1f / 6f);

        var dposdt     = ((a.velocity + ((b.velocity + c.velocity) * factor)) + d.velocity) * divisor;
        var dmomenumdt = ((a.force + ((b.force + c.force) * factor)) + d.force) * divisor;

        pos      += dposdt;
        momentum += (dmomenumdt * dt);
        angle    += divisor * dt * (a.torque + (factor * (b.torque + c.torque)) + d.torque);
        recalculate();
    }
コード例 #4
0
    public override Vector3 acceleration(float dt, InputTuple i)
    {
        forward_vector = transform.TransformDirection(Vector3.forward) * -1;

        var v = forward_vector * i.forward;

        // friction
        if (on_ground)
        {
            friction = 1f;
        }
        else
        {
            friction = .02f;
        }

        var d = new Vector3(accel.x, 0, accel.z) - v;

        if (d.magnitude > friction / 5f)
        {
            d  = d.normalized;
            d *= friction * 60000f * dt;
        }
        else
        {
            d *= friction * 60000f * dt;
        }

        if (!on_ground)
        {
            accel.y = -9800f * dt;
        }
        else
        {
            d.x    -= momentum.x * friction * 2500f * dt;
            d.z    -= momentum.z * friction * 2500f * dt;
            accel.y = Mathf.Max(accel.y, 0);
        }

        d.y = accel.y;
        return(d);
    }
コード例 #5
0
 public override float torque(float dt, InputTuple i)
 {
     spin = i.turn * 6000f * dt;
     return(spin);
 }
コード例 #6
0
 public virtual Vector3 acceleration(float dt, InputTuple i)
 {
     return(Vector3.zero);
 }
コード例 #7
0
 public virtual float torque(float dt, InputTuple i)
 {
     return(0);
 }
コード例 #8
0
 private Derivative evaluate1(float t, InputTuple i)
 {
     return(new Derivative(velocity, acceleration(0, i), torque(0, i)));
 }