private SceneRaycastHit GetSceneHitForGridSnap() { var pickRay = RTInputDevice.Get.Device.GetRay(RTFocusCamera.Get.TargetCamera); var raycastFilter = new SceneRaycastFilter(); raycastFilter.AllowedObjectTypes.Add(GameObjectType.Mesh); return(RTScene.Get.Raycast(pickRay, SceneRaycastPrecision.BestFit, raycastFilter)); }
public static GameObject SpawnInFrontOfCamera(GameObject sourceObject, Camera camera, float objectSize) { float halfSize = objectSize * 0.5f; var boundsQConfig = new ObjectBounds.QueryConfig(); boundsQConfig.ObjectTypes = GameObjectTypeHelper.AllCombined; boundsQConfig.NoVolumeSize = Vector3Ex.FromValue(1.0f); Transform cameraTransform = camera.transform; AABB aabb = ObjectBounds.CalcHierarchyWorldAABB(sourceObject, boundsQConfig); if (!aabb.IsValid) { return(null); } Sphere sphere = new Sphere(aabb); Vector3 fromCenterToPos = sourceObject.transform.position - sphere.Center; float zOffset = Mathf.Max(camera.nearClipPlane + sphere.Radius, sphere.Radius / halfSize); Vector3 spherePos = cameraTransform.position + cameraTransform.forward * zOffset; GameObject spawned = GameObject.Instantiate(sourceObject, spherePos + fromCenterToPos, sourceObject.transform.rotation) as GameObject; OBB spawnedOBB = ObjectBounds.CalcHierarchyWorldOBB(spawned, boundsQConfig); Ray ray = new Ray(camera.transform.position, (spawnedOBB.Center - camera.transform.position).normalized); var raycastFilter = new SceneRaycastFilter(); raycastFilter.AllowedObjectTypes.Add(GameObjectType.Mesh); var rayHit = RTScene.Get.Raycast(ray, SceneRaycastPrecision.BestFit, raycastFilter); if (rayHit.WasAnObjectHit) { Vector3 oldCenter = spawnedOBB.Center; spawnedOBB.Center = rayHit.ObjectHit.HitPoint; Vector3 offsetVector = spawnedOBB.Center - oldCenter; offsetVector += ObjectSurfaceSnap.CalculateSitOnSurfaceOffset(spawnedOBB, rayHit.ObjectHit.HitPlane, 0.0f); spawned.transform.position += offsetVector; } return(spawned); }
public List <GameObjectRayHit> RaycastAllObjectsSorted(Ray ray, SceneRaycastPrecision rtRaycastPrecision, SceneRaycastFilter raycastFilter) { if (raycastFilter != null && raycastFilter.AllowedObjectTypes.Count == 0) { return(new List <GameObjectRayHit>()); } List <GameObjectRayHit> sortedHits = RaycastAllObjectsSorted(ray, rtRaycastPrecision); if (raycastFilter != null) { raycastFilter.FilterHits(sortedHits); } return(sortedHits); }
public SceneRaycastHit Raycast(Ray ray, SceneRaycastPrecision rtRaycastPrecision, SceneRaycastFilter raycastFilter) { List <GameObjectRayHit> allObjectHits = RaycastAllObjectsSorted(ray, rtRaycastPrecision, raycastFilter); GameObjectRayHit closestObjectHit = allObjectHits.Count != 0 ? allObjectHits[0] : null; XZGridRayHit gridRayHit = RaycastSceneGridIfVisible(ray); return(new SceneRaycastHit(closestObjectHit, gridRayHit)); }
public bool RaycastAllObjectsSorted(Ray ray, SceneRaycastPrecision rtRaycastPrecision, SceneRaycastFilter raycastFilter, List <GameObjectRayHit> hits) { hits.Clear(); if (raycastFilter != null && raycastFilter.AllowedObjectTypes.Count == 0) { return(false); } RaycastAllObjectsSorted(ray, rtRaycastPrecision, hits); if (raycastFilter != null) { raycastFilter.FilterHits(hits); } return(hits.Count != 0); }
public SceneRaycastHit Raycast(Ray ray, SceneRaycastPrecision rtRaycastPrecision, SceneRaycastFilter raycastFilter) { RaycastAllObjectsSorted(ray, rtRaycastPrecision, raycastFilter, _objectHitBuffer); GameObjectRayHit closestObjectHit = _objectHitBuffer.Count != 0 ? _objectHitBuffer[0] : null; XZGridRayHit gridRayHit = RaycastSceneGridIfVisible(ray); return(new SceneRaycastHit(closestObjectHit, gridRayHit)); }