コード例 #1
0
    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;
    }