void determineInitialConfigurations(ref List <ExperimentSetup> experimentSetups) { for (int i = 0; i < experimentSetups.Count; i++) { ExperimentSetup setup = experimentSetups[i]; if (setup.initialConfiguration.isRandom) { if (!onlyRandomizeForward) { setup.initialConfiguration.initialPosition = VirtualPathGenerator.getRandomPositionWithinBounds(-0.5f * setup.trackingSizeShape.x, 0.5f * setup.trackingSizeShape.x, -0.5f * setup.trackingSizeShape.z, 0.5f * setup.trackingSizeShape.z); } setup.initialConfiguration.initialForward = VirtualPathGenerator.getRandomForward(); //Debug.LogWarning("Random Initial Configuration for size (" + trackingSizeShape.x + ", " + trackingSizeShape.z + "): Pos" + initialConfiguration.initialPosition.ToString("f2") + " Forward" + initialConfiguration.initialForward.ToString("f2")); experimentSetups[i] = setup; } else if (Mathf.Abs(setup.initialConfiguration.initialPosition.x) > 0.5f * setup.trackingSizeShape.x || Mathf.Abs(setup.initialConfiguration.initialPosition.y) > 0.5f * setup.trackingSizeShape.z) { Debug.LogError("Invalid beginning position selected. Defaulting Initial Configuration to (0, 0) and (0, 1)."); setup.initialConfiguration.initialPosition = Vector2.zero; setup.initialConfiguration.initialForward = Vector2.up; experimentSetups[i] = setup; } if (!setup.initialConfiguration.isRandom) { // Deal with diagonal hack if (setup.initialConfiguration.initialForward == Vector2.one) { setup.initialConfiguration.initialForward = (new Vector2(setup.trackingSizeShape.x, setup.trackingSizeShape.z)).normalized; experimentSetups[i] = setup; } } } }
Dictionary <string, string> getExperimentDescriptor(ExperimentSetup setup) { Dictionary <string, string> descriptor = new Dictionary <string, string>(); descriptor["redirector"] = setup.redirector.ToString(); descriptor["resetter"] = setup.resetter == null ? "no_reset" : setup.resetter.ToString(); descriptor["tracking_size_x"] = setup.trackingSizeShape.x.ToString(); descriptor["tracking_size_z"] = setup.trackingSizeShape.z.ToString(); return(descriptor); }
void endExperiment() { //Debug.LogWarning("Last Experiment Length: " + (Time.realtimeSinceStartup - lastExperimentRealStartTime)); ExperimentSetup setup = experimentSetups[experimentIterator]; // Stop Trail Drawing simulationManager.trailDrawer.enabled = false; // Delete Virtual Path // THIS CAN BE MADE OPTIONAL IF NECESSARY simulationManager.trailDrawer.ClearTrail(TrailDrawer.VIRTUAL_TRAIL_NAME); // Disable Waypoint simulationManager.motionManager.targetWaypoint.gameObject.SetActive(true); // Disallow Walking simulationManager.userIsWalking = false; // Stop Logging simulationManager.statisticsLogger.EndLogging(); // Gather Summary Statistics simulationManager.statisticsLogger.experimentResults.Add(simulationManager.statisticsLogger.GetExperimentResultForSummaryStatistics(getExperimentDescriptor(setup))); // Log Sampled Metrics if (simulationManager.statisticsLogger.logSampleVariables) { Dictionary <string, List <float> > oneDimensionalSamples; Dictionary <string, List <Vector2> > twoDimensionalSamples; simulationManager.statisticsLogger.GetExperimentResultsForSampledVariables(out oneDimensionalSamples, out twoDimensionalSamples); simulationManager.statisticsLogger.LogAllExperimentSamples(experimentDescriptorToString(getExperimentDescriptor(setup)), oneDimensionalSamples, twoDimensionalSamples); } // Take Snapshot In Next Frame (After User and Virtual Path Is Disabled) if (!simulationManager.runAtFullSpeed) { simulationManager.takeScreenshot = true; } // Prepared for new experiment experimentIterator++; //lastExperimentEndTime = Time.time; experimentInProgress = false; // Log All Summary Statistics To File if (experimentIterator == experimentSetups.Count) { if (simulationManager.averageTrialResults) { simulationManager.statisticsLogger.experimentResults = mergeTrialSummaryStatistics(simulationManager.statisticsLogger.experimentResults); } simulationManager.statisticsLogger.LogExperimentSummaryStatisticsResultsSCSV(simulationManager.statisticsLogger.experimentResults); Debug.Log("Last Experiment Complete"); experimentComplete = true; } // Disabling Redirectors simulationManager.redirectionManager.RemoveRedirector(); simulationManager.redirectionManager.RemoveResetter(); }
void startNextExperiment() { Debug.Log("---------- EXPERIMENT STARTED ----------"); ExperimentSetup setup = experimentSetups[experimentIterator]; printExperimentDescriptor(getExperimentDescriptor(setup)); // Setting Gain Scale Factors //RedirectionManager.SCALE_G_T = setup.gainScaleFactor.x; //RedirectionManager.SCALE_G_R = setup.gainScaleFactor.y; //RedirectionManager.SCALE_G_C = setup.gainScaleFactor.z; // Enabling/Disabling Redirectors simulationManager.redirectionManager.UpdateRedirector(setup.redirector); simulationManager.redirectionManager.UpdateResetter(setup.resetter); // Setup Trail Drawing simulationManager.trailDrawer.enabled = !simulationManager.runAtFullSpeed; // Enable Waypoint simulationManager.motionManager.targetWaypoint.gameObject.SetActive(true); // Resetting User and World Positions and Orientations this.transform.position = Vector3.zero; this.transform.rotation = Quaternion.identity; // ESSENTIAL BUG FOUND: If you set the user first and then the redirection recipient, then the user will be moved, so you have to make sure to do it afterwards! //Debug.Log("Target User Position: " + setup.initialConfiguration.initialPosition.ToString("f4")); simulationManager.redirectionManager.headTransform.position = Utilities.UnFlatten(setup.initialConfiguration.initialPosition, simulationManager.redirectionManager.headTransform.position.y); //Debug.Log("Result User Position: " + redirectionManager.userHeadTransform.transform.position.ToString("f4")); simulationManager.redirectionManager.headTransform.rotation = Quaternion.LookRotation(Utilities.UnFlatten(setup.initialConfiguration.initialForward), Vector3.up); // Set up Tracking Area Dimensions simulationManager.envManager.UpdateTrackedSpaceDimensions(setup.trackingSizeShape.x, setup.trackingSizeShape.z); // Set up Virtual Path float sumOfDistances, sumOfRotations; simulationManager.motionManager.waypoints = VirtualPathGenerator.generatePath(setup.pathSeed, setup.initialConfiguration.initialPosition, setup.initialConfiguration.initialForward, out sumOfDistances, out sumOfRotations); Debug.Log("sumOfDistances: " + sumOfDistances); Debug.Log("sumOfRotations: " + sumOfRotations); if (setup.redirector == typeof(ZigZagRedirector)) { // Create Fake POIs Transform poiRoot = (new GameObject()).transform; poiRoot.name = "ZigZag Redirector Waypoints"; poiRoot.localPosition = Vector3.zero; poiRoot.localRotation = Quaternion.identity; Transform poi0 = (new GameObject()).transform; poi0.localPosition = Vector3.zero; poi0.parent = poiRoot; List <Transform> zigzagRedirectorWaypoints = new List <Transform>(); zigzagRedirectorWaypoints.Add(poi0); foreach (Vector2 waypoint in simulationManager.motionManager.waypoints) { Transform poi = (new GameObject()).transform; poi.localPosition = Utilities.UnFlatten(waypoint); poi.parent = poiRoot; zigzagRedirectorWaypoints.Add(poi); } ((ZigZagRedirector)simulationManager.redirectionManager.redirector).waypoints = zigzagRedirectorWaypoints; } // Set First Waypoint Position and Enable It simulationManager.motionManager.targetWaypoint.position = new Vector3(simulationManager.motionManager.waypoints[0].x, simulationManager.motionManager.targetWaypoint.position.y, simulationManager.motionManager.waypoints[0].y); simulationManager.motionManager.waypointIterator = 0; // POSTPONING THESE FOR SAFETY REASONS! //// Allow Walking //UserController.allowWalking = true; //// Start Logging //redirectionManager.redirectionStatistics.beginLogging(); //redirectionManager.statisticsLogger.beginLogging(); //lastExperimentRealStartTime = Time.realtimeSinceStartup; experimentInProgress = true; }