protected override float update(Transform currentCamera, Actor[] subjects, Shot shot, float maxExecutionTime) { double maxMilliseconds = maxExecutionTime * 1000; double begin = System.DateTime.Now.TimeOfDay.TotalMilliseconds; //Wiced Improvement setPosition(bestPosition + SubjectsVelocity*Time.deltaTime,currentCamera,shot); bestFitness = shot.GetQuality (subjects,currentCamera.GetComponent<Camera> ()); float lookAtFitness = shot.InFrustum(subjects) * .5f + shot.GetQuality (lookAtInfluencingProperties,subjects) * .5f; bestPosition = currentCamera.transform.position; while (System.DateTime.Now.TimeOfDay.TotalMilliseconds - begin < maxMilliseconds) { Vector3 positionForce = Vector3.zero; foreach (Property p in shot.Properties) { if (p is ProjectionSize) positionForce += ((ProjectionSize)p).PositionForce (subjects, currentCamera); if (p is VantageAngle) positionForce += ((VantageAngle)p).PositionForce (subjects, currentCamera); } foreach (Actor s in subjects) positionForce += PropertiesForces.OcclusionAvoidanceForce(s,currentCamera); foreach (Actor s in subjects) positionForce += PropertiesForces.InFrustumForce(s,currentCamera); if (positionForce.magnitude >1) positionForce.Normalize(); //Wiced Improvement setPosition(bestPosition + positionForce + Random.insideUnitSphere * (1 - Mathf.Pow (bestFitness, 2)) * CombinedSubjectsScale(subjects),currentCamera,shot); //Previous: setPosition(bestPosition + positionForce,currentCamera,shot); //Wiced Improvement Vector3 tmpLookAt = SubjectsCenter (subjects) + Random.insideUnitSphere * (1 - Mathf.Pow (lookAtFitness, 4)) * CombinedSubjectsScale(subjects); //Previous: Vector3 tmpLookAt = SubjectsCenter (subjects) + Random.insideUnitSphere * (1-lookAtFitness); currentCamera.LookAt (tmpLookAt); float tmpFit = shot.GetQuality (subjects,currentCamera.GetComponent<Camera> ()); logTrace (currentCamera.position, currentCamera.forward, tmpFit); if (tmpFit > bestFitness) { bestFitness = tmpFit; bestPosition = currentCamera.position; bestForward = currentCamera.forward; } } currentCamera.position = bestPosition; currentCamera.forward = bestForward; return bestFitness; }