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); } } } }
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; }
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; }
public void OnPanelCloseSignal(PanelCloseSignal signal) { var sender = signal.Panel; var vid = sender.GetVehicleId(); Vehicle3D vehicle3d = _vehicles3D.GetItem(vid); _vehicles3D.RemoveItem(vid); vehicle3d?.Dispose(); }
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); }
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; }
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); }
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); }
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); } }
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; }
public static Vector3 Seek(Vehicle3D me, Vector3 position) { var toDest = position - me.position; var desiredVelocity = toDest.normalized * me.maxSpeed; return desiredVelocity - me.velocity; }
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; }
public static Vector3 Follow(Vehicle3D me, Vector3 destination) { var toDest = destination - me.position; return toDest; }
public void centerVehicle(Vehicle3D vehicle) { vehicle.transform.position = centerPivot.position; }
private void SetUpVehicleName(Vehicle3D vehicle) { GameUIManager.instance.UpdateVehicleName(vehicle.GetVehicleName()); }
private void EnableVehicle(Vehicle3D vehicle, bool state) { vehicle.SetVehicleActive(state); }
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; }