Exemplo n.º 1
0
    public void AddVehicle3D(Vehicle v)
    {
        if (v != null)
        {
            if (v.Avm && v.Location != null && v.Location.Coordinates != null)
            {
                var vv = _vehicles3D.GetItem(v.Id);
                if (vv == null)
                {
                    Vehicle3D vehicle3D = null;
                    if (v.CodiceFamiglia == model.CodiceFamigliaEnum.EXTRAURBANO)
                    {
                        vehicle3D = _extraurbanoFactory.Create(v);
                    }
                    else
                    {
                        vehicle3D = _urbanoFactory.Create(v);
                    }

                    SetVehicle3DTransform(vehicle3D, v);

                    _vehicles3D.AddItem(v.Id, vehicle3D);
                }
                else
                {
                    SetVehicle3DTransform(vv, v);
                }
            }
        }
    }
Exemplo n.º 2
0
    Vector3 CalculateSteering(Vehicle3D fish, Vehicle3D[] neighbors, int nNeighbors)
    {
        var sqrMaxForce = maxForce * maxForce;
        var v = Vector3.zero;

        v += antiPenetrateWeight * SteeringBehaviours.AntiPenetrate(fish, neighbors, nNeighbors, antiPenetrateRadius);
        if (sqrMaxForce < v.sqrMagnitude)
            return v;

        if (_spheres.Length > 0) {
            v += avoidanceWeight * SteeringBehaviours.SphereAvoidance(fish, _spheres, avoidanceCylinderLength, avoidanceCylinderRadius);
            if (sqrMaxForce < v.sqrMagnitude)
                return v;
        }

        if (leader != null) {
            v += followLeaderWeight * SteeringBehaviours.Follow(fish, leader.position);
            if (sqrMaxForce < v.sqrMagnitude)
                return v;
        }

        v += separateWeight * SteeringBehaviours.Separate(fish, neighbors, nNeighbors, separateRadius);
        if (sqrMaxForce < v.sqrMagnitude)
            return v;

        v += alignWeight * SteeringBehaviours.Align(fish, neighbors, nNeighbors, alignRadius, separateRadius);
        if (sqrMaxForce < v.sqrMagnitude)
            return v;

        v += cohereWeight * SteeringBehaviours.Cohere(fish, neighbors, nNeighbors, cohereRadius, separateRadius);
        if (sqrMaxForce < v.sqrMagnitude)
            return v;

        return v;
    }
Exemplo n.º 3
0
 public static Vector3 AntiPenetrate(Vehicle3D me, Vehicle3D[] neighbors, int nNeighbors, float radius)
 {
     var v = Vector3.zero;
     if (neighbors.FindInRadius(me.position, radius, nNeighbors).Count() > 0) {
         v = Random.insideUnitCircle * me.maxSpeed;
     }
     return v;
 }
Exemplo n.º 4
0
    public void OnPanelCloseSignal(PanelCloseSignal signal)
    {
        var sender = signal.Panel;
        var vid    = sender.GetVehicleId();

        Vehicle3D vehicle3d = _vehicles3D.GetItem(vid);

        _vehicles3D.RemoveItem(vid);
        vehicle3d?.Dispose();
    }
Exemplo n.º 5
0
    public static Vector3 Arrive(Vehicle3D me, Vector3 position, float baseSpeed)
    {
        var toDest = position - me.position;
        var dist = toDest.magnitude;
        if (dist < 1e-3f)
            return Vector3.zero;

        var speed = Mathf.Min(me.maxSpeed, dist * baseSpeed);
        return toDest * (speed / dist);
    }
Exemplo n.º 6
0
 public static Vector3 Cohere(Vehicle3D me, Vehicle3D[] neighbors, int nNeighbors, float radius, float minRadius)
 {
     var v = Vector3.zero;
     var count = 0;
     var sqrMinRadius = minRadius * minRadius;
     foreach (var f in neighbors.FindInRadius(me.position, radius, nNeighbors)) {
         var distvec = f.position - me.position;
         if (distvec.sqrMagnitude < sqrMinRadius)
             continue;
         v += f.position;
         count++;
     }
     if (count > 0) {
         v = v / count - me.position;
     }
     return v;
 }
Exemplo n.º 7
0
    public IEnumerator MoveToSide(Vehicle3D vehicle, Vector3 targetSide)
    {
        float timeElapsed = 0f;
        float t           = 0f;

        while (timeElapsed < moveDuration)
        {
            t = timeElapsed / moveDuration;
            t = t * t * t * (t * (6f * t - 15f) + 10f);
            vehicle.transform.position = (Vector3.Lerp(centerPivot.position, targetSide, t) + vehicle.GetComponent <AnchorGameObject>().currentAnchor);
            timeElapsed += Time.deltaTime;

            yield return(null);
        }

        vehicle.transform.position = targetSide;
        vehicle.StopMoving();
        EnableVehicle(vehicle, false);
    }
Exemplo n.º 8
0
    void SetVehicle3DTransform(Vehicle3D vehicle3D, Vehicle v)
    {
        var gameObjTrans = vehicle3D.gameObject.transform;

        gameObjTrans.SetParent(_container3dView.GetTransform());

        var latitude  = v.Location.Coordinates[0];
        var longitude = v.Location.Coordinates[1];

        float x = (float)(latitude * 1000000) % 100;
        float z = (float)(longitude * 1000000) % 100;

        gameObjTrans.position = new Vector3(x, 0, z);

        System.Random random = new System.Random();
        float         r      = random.Next(0, 8) * 45.0f;

        gameObjTrans.rotation = Quaternion.Euler(0, r, 0);
    }
Exemplo n.º 9
0
    void OpenPanel(PanelOpenSignal signal)
    {
        var v = signal.SelectedVehicle;

        Vehicle3D result = null;

        result = _vehicles3D.GetItem(v.Id);

        if (result != null)
        {
            Debug.Log("panello trovato");
            _vehicles3D.RemoveItem(v.Id);
            result.Dispose();
        }
        else
        {
            AddVehicle3D(v);
        }
    }
Exemplo n.º 10
0
    public IEnumerator MoveFromSide(Vehicle3D vehicle, Vector3 initSide)
    {
        float timeElapsed = 0f;
        float t           = 0f;

        vehicle.transform.position = initSide;
        yield return(null);

        EnableVehicle(vehicle, true);
        while (timeElapsed < moveDuration)
        {
            t = timeElapsed / moveDuration;
            t = t * t * t * (t * (6f * t - 15f) + 10f);
            vehicle.transform.position = Vector3.Lerp(initSide, centerPivot.position, t) + vehicle.GetComponent <AnchorGameObject>().currentAnchor;
            timeElapsed += Time.deltaTime;

            yield return(null);
        }

        vehicle.transform.position = centerPivot.position;
        EnableVehicle(vehicle, true);
        vehicle.StartMoving();
        isPassingVehicle = false;
    }
Exemplo n.º 11
0
 public static Vector3 Seek(Vehicle3D me, Vector3 position)
 {
     var toDest = position - me.position;
     var desiredVelocity = toDest.normalized * me.maxSpeed;
     return desiredVelocity - me.velocity;
 }
Exemplo n.º 12
0
 public static Vector3 Separate(Vehicle3D me, Vehicle3D[] neighbors, int nNeighbors, float radius)
 {
     var v = Vector3.zero;
     foreach (var f in neighbors.FindInRadius(me.position, radius, nNeighbors)) {
         var distvec = f.position - me.position;
         v -= distvec;
     }
     return v;
 }
Exemplo n.º 13
0
 public static Vector3 Follow(Vehicle3D me, Vector3 destination)
 {
     var toDest = destination - me.position;
     return toDest;
 }
Exemplo n.º 14
0
 public void centerVehicle(Vehicle3D vehicle)
 {
     vehicle.transform.position = centerPivot.position;
 }
Exemplo n.º 15
0
 private void SetUpVehicleName(Vehicle3D vehicle)
 {
     GameUIManager.instance.UpdateVehicleName(vehicle.GetVehicleName());
 }
Exemplo n.º 16
0
 private void EnableVehicle(Vehicle3D vehicle, bool state)
 {
     vehicle.SetVehicleActive(state);
 }
Exemplo n.º 17
0
    public static Vector3 SphereAvoidance(Vehicle3D me, ISphere[] spheres, float cylinderLength, float cylinderRadius)
    {
        var closestIntersectionX = float.MaxValue;
        ISphere closestSphere = null;

        foreach (var sp in spheres) {
            var sqrEffectiveRadius = cylinderLength * cylinderLength + sp.radius * sp.radius;
            var me2sp = sp.position - me.position;
            if (sqrEffectiveRadius < me2sp.sqrMagnitude)
                continue;
            var localSphereCenterX = Vector3.Dot(me.forward, me2sp);
            if (localSphereCenterX <= 0)
                continue;
            var sqrLocalSphereCenterY = Vector3.Cross(me.forward, me2sp).sqrMagnitude;
            var outerRadius = sp.radius + cylinderRadius;
            if ((outerRadius * outerRadius) < sqrLocalSphereCenterY)
                continue;
            var d = Mathf.Sqrt(sp.radius * sp.radius - sqrLocalSphereCenterY);
            var intersectionX = localSphereCenterX - d;
            if (intersectionX < 0)
                intersectionX = localSphereCenterX + d;
            if (intersectionX < closestIntersectionX) {
                closestIntersectionX = intersectionX;
                closestSphere = sp;
            }
        }
        if (closestIntersectionX == float.MaxValue)
            return Vector3.zero;

        var toSp = closestSphere.position - me.position;
        var distMult = 1.0f + (cylinderLength - closestIntersectionX) / cylinderLength;
        var sideForce = Vector3.Dot(me.forward, toSp) * me.forward - toSp;
        var sideForceMag = sideForce.magnitude;
        sideForce *= (closestSphere.radius + cylinderRadius - sideForceMag) / sideForceMag * distMult;

        var breakForce = -0.2f * (cylinderLength - closestIntersectionX) * toSp.normalized;

        return sideForce + breakForce;
    }