/// <summary> /// Function called when the manipulation is ended. /// </summary> /// <param name="gesture">The current gesture.</param> protected override void OnEndManipulation(TapGesture gesture) { if (gesture.WasCancelled) { return; } // If gesture is targeting an existing object we are done. if (gesture.TargetObject != null) { return; } // Raycast against the location the player touched to search for planes. TrackableHit hit; TrackableHitFlags raycastFilter = TrackableHitFlags.PlaneWithinPolygon; if (PlacingMode && Frame.Raycast( gesture.StartPosition.x, gesture.StartPosition.y, raycastFilter, out hit)) { // Use hit pose and camera pose to check if hittest is from the // back of the plane, if it is, no need to create the anchor. if ((hit.Trackable is DetectedPlane) && Vector3.Dot(FirstPersonCamera.transform.position - hit.Pose.position, hit.Pose.rotation * Vector3.up) < 0) { Debug.Log("Hit at back of the current DetectedPlane"); } else { // Instantiate game object at the hit pose. var gameObject = Instantiate(PawnPrefab, hit.Pose.position, hit.Pose.rotation); // Instantiate manipulator. var manipulator = Instantiate(ManipulatorPrefab, hit.Pose.position, hit.Pose.rotation); // Make game object a child of the manipulator. gameObject.transform.parent = manipulator.transform; cubeManager.barGraphs.Add(new BarGraph(gameObject, cubeManager.numberOfCubes)); cubeManager.GenerateBlocks(); cubeManager.GenerateBlocks(); // Create an anchor to allow ARCore to track the hitpoint as understanding of // the physical world evolves. var anchor = hit.Trackable.CreateAnchor(hit.Pose); // Make manipulator a child of the anchor. manipulator.transform.parent = anchor.transform; // Select the placed object. ManipulationSystem.Instance.Select(manipulator); PlacingMode = false; helper.SetActive(false); UIVisiblity(true); } } }