/// <summary> /// Shift scene towards (+) / away-from (-) camera. /// If bKeepTargetPos == false, then target shifts with scene /// </summary> public void SceneZoom(FScene scene, fCamera cam, float dz, bool bKeepTargetPos = true) { if (dz == 0.0f) { return; } float fScale = scene.GetSceneScale(); //Vector3f fw = cam.gameObject.transform.forward; Vector3f fw = cam.GetTarget() - cam.GetPosition(); float fTargetDist = fw.Length; fw.Normalize(); float fMinTargetDist = 0.1f * fScale; if (dz > 0 && fTargetDist - dz < fMinTargetDist) { dz = fTargetDist - fMinTargetDist; } Vector3f delta = dz * fw; scene.RootGameObject.Translate(-delta, false); if (bKeepTargetPos) { cam.SetTarget(cam.GetTarget() - delta); } }
public CameraState GetCurrentState(FScene scene) { CameraState s = new CameraState(); s.camPosition = Camera.GetPosition(); s.camRotation = Camera.GetRotation(); s.scenePosition = scene.RootGameObject.GetPosition(); s.sceneRotation = scene.RootGameObject.GetRotation(); s.target = Camera.GetTarget(); s.turntableAzimuth = turntableAzimuthD; s.turntableAltitude = turntableAltitudeD; return(s); }
public void SceneAdaptivePan(FScene scene, fCamera cam, float xStepFraction, float yStepFraction) { float fScale = scene.GetSceneScale(); Vector3f fw = cam.GetTarget() - cam.GetPosition(); float fTargetDist = fw.Length; float dx = fTargetDist * xStepFraction; float dy = fTargetDist * yStepFraction; Frame3f camFrame = cam.GetWorldFrame(); Vector3f right = camFrame.X; Vector3f up = camFrame.Y; Vector3f delta = dx * fScale * right + dy * fScale * up; Vector3f newPos = scene.RootGameObject.GetPosition() + delta; scene.RootGameObject.SetPosition(newPos); }
/// <summary> /// translates scene so that focusPointS lies on camera forward axis. Also updates /// camera.Target to be at this point. /// </summary> public void PanFocusOnScenePoint(FScene scene, fCamera camera, Vector3f focusPointS) { Vector3f focusPointW = scene.ToWorldP(focusPointS); // figure out the pan that we would apply to camera, then apply the delta to the scene Vector3f camPosW = camera.GetPosition(); Vector3f camForward = camera.Forward(); float fDist = Vector3.Dot((focusPointW - camPosW), camForward); if (fDist == 0) { fDist = 2.0f * ((Camera)camera).nearClipPlane; } Vector3f newCamPosW = focusPointW - fDist * camForward; Vector3f delta = camPosW - newCamPosW; scene.RootGameObject.Translate(delta, false); camera.SetTarget(focusPointW + delta); }
public void ScenePanFocus(FScene scene, fCamera camera, Vector3f focusPointW, bool bAnimated) { CameraAnimator animator = camera.Animator(); if (bAnimated == false || animator == null) { // figure out the pan that we would apply to camera, then apply the delta to the scene Vector3f camPosW = camera.GetPosition(); Vector3f camForward = camera.Forward(); float fDist = Vector3.Dot((focusPointW - camPosW), camForward); Vector3f newCamPosW = focusPointW - fDist * camForward; Vector3f delta = camPosW - newCamPosW; scene.RootGameObject.Translate(delta, false); camera.SetTarget(focusPointW + delta); } else { animator.PanFocus(focusPointW); } }
public void ScenePanFocus(FScene scene, fCamera camera, Vector3f focusPoint, bool bAnimated) { CameraAnimator animator = camera.Animator(); if (bAnimated == false || animator == null) { // figure out the pan that we would apply to camera, then apply the delta to the scene Vector3f curPos = camera.GetPosition(); Vector3f curDir = camera.GetWorldFrame().Z; float fDist = Vector3.Dot((focusPoint - curPos), curDir); Vector3f newPos = focusPoint - fDist * curDir; Vector3f delta = curPos - newPos; scene.RootGameObject.Translate(delta, false); camera.SetTarget(focusPoint); } else { animator.PanFocus(focusPoint); } }
/// <summary> /// Shift scene towards (+) / away-from (-) camera. /// If bKeepTargetPos == false, then target shifts with scene /// </summary> public void SceneZoom(FScene scene, fCamera cam, float dz, bool bKeepTargetPos = true) { if (dz == 0.0f) { return; } if (cam.IsOrthographic) { float f = cam.OrthoHeight; f = f - dz; if (f < 0) { f = 0.01f; } cam.OrthoHeight = f; scene.Context.CameraManager.UpdateMainCamOrthoSize(); } else { float fScale = scene.GetSceneScale(); Vector3f fw = cam.GetTarget() - cam.GetPosition(); float fTargetDist = fw.Length; fw.Normalize(); float fMinTargetDist = 0.1f * fScale; if (dz > 0 && fTargetDist - dz < fMinTargetDist) { dz = fTargetDist - fMinTargetDist; } Vector3f delta = dz * fw; scene.RootGameObject.Translate(-delta, false); if (bKeepTargetPos) { cam.SetTarget(cam.GetTarget() - delta); } } }
public override void PreRender() { fCamera cam = Parent.Context.ActiveCamera; float zNear = 2 * cam.NearClipPlane; Vector3f forwardW = cam.Forward(); Vector3f gridCenterW = cam.GetPosition() + zNear * forwardW; Vector3f inCenterW = (Parent as FScene).ToWorldP(Center); //Vector3f gridDirS = (Parent as FScene).ToSceneN(forwardW); //Frame3f gridFrame = new Frame3f(gridCenter, gridDir); //Frame3f gridFrame = new Frame3f(Center, gridDirS); //Frame3f gridFrameW = new Frame3f(inCenterW, forwardW); Frame3f gridFrameW = new Frame3f(gridCenterW, forwardW); RootGameObject.SetWorldFrame(gridFrameW); if (grids_valid == false) { update_grids(); } }
// Use this for initialization public void Initialize(FContext controller) { this.controller = controller; // find main camera GameObject[] mainCameras = GameObject.FindGameObjectsWithTag("MainCamera"); if (mainCameras.Length == 0) { throw new MissingComponentException("CameraTracking.Initialize: could not find camera with tag MainCamera"); } var mainCameraObj = mainCameras[0]; if (mainCameras.Length > 1) { DebugUtil.Log(2, "CameraTracking.Initialize: there are multiple objects with tag MainCamera. Using the one named " + mainCameraObj.GetName()); } mainCamera = new fCamera(mainCameraObj.GetComponent <Camera> () as Camera); // on Vive the MainCamera will have some child cameras that are a problem, // so get rid of them if (gs.VRPlatform.CurrentVRDevice == gs.VRPlatform.Device.HTCVive) { List <GameObject> children = new List <GameObject>(mainCameraObj.Children()); foreach (var child in children) { mainCameraObj.RemoveChild(child); child.Destroy(); } } List <Camera> newCameras = new List <Camera>(); Vector3f mainPos = mainCamera.GetPosition(); Quaternionf mainRot = mainCamera.GetRotation(); // create camera for 3D widgets layer widgetCamera = new fCamera(Camera.Instantiate((Camera)mainCamera, mainPos, mainRot)); widgetCamera.SetName("WidgetCamera"); newCameras.Add(widgetCamera); // create camera for HUD layer hudCamera = new fCamera(Camera.Instantiate((Camera)mainCamera, mainPos, mainRot)); hudCamera.SetName("HUDCamera"); newCameras.Add(hudCamera); // create camera for UI uiCamera = new fCamera(Camera.Instantiate((Camera)mainCamera, mainPos, mainRot)); uiCamera.SetName("UICamera"); ((Camera)uiCamera).orthographic = true; ((Camera)uiCamera).orthographicSize = 0.5f; newCameras.Add(uiCamera); // create camera for cursor cursorCamera = new fCamera(Camera.Instantiate((Camera)mainCamera, mainPos, mainRot)); cursorCamera.SetName("CursorCamera"); newCameras.Add(cursorCamera); // configure these cameras // - must disable audio listener if it exists // - do depth clear so we can draw on top of other layers foreach (Camera cam in newCameras) { AudioListener listener = cam.GetComponent <AudioListener>(); if (listener != null) { listener.enabled = false; } cam.clearFlags = CameraClearFlags.Depth; cam.tag = "Untagged"; } // set up camera masks // this camera only renders 3DWidgetOverlay layer, and mainCam does not! int nWidgetLayer = FPlatform.WidgetOverlayLayer; int nHUDLayer = FPlatform.HUDLayer; int nUILayer = FPlatform.UILayer; int nCursorLayer = FPlatform.CursorLayer; ((Camera)widgetCamera).cullingMask = (1 << nWidgetLayer); ((Camera)hudCamera).cullingMask = (1 << nHUDLayer); ((Camera)uiCamera).cullingMask = (1 << nUILayer); ((Camera)cursorCamera).cullingMask = (1 << nCursorLayer); ((Camera)mainCamera).cullingMask &= ~(1 << nWidgetLayer); ((Camera)mainCamera).cullingMask &= ~(1 << nHUDLayer); ((Camera)mainCamera).cullingMask &= ~(1 << nUILayer); ((Camera)mainCamera).cullingMask &= ~(1 << nCursorLayer); // attach camera animation object to main camera CameraAnimator anim = mainCamera.AddComponent <CameraAnimator>(); anim.UseCamera = mainCamera; anim.UseScene = this.controller.Scene; // add target point to camera CameraTarget target = mainCamera.AddComponent <CameraTarget>(); target.TargetPoint = new Vector3f(0.0f, mainCamera.GetPosition().y, 0.0f); target.context = this.controller; // add camera manipulator to camera // TODO: this does not need to be a monobehavior... var manipulator = mainCamera.AddComponent <CameraManipulator>(); manipulator.Camera = mainCamera; // initialize FPlatform FPlatform.MainCamera = mainCamera; FPlatform.WidgetCamera = widgetCamera; FPlatform.HUDCamera = hudCamera; FPlatform.OrthoUICamera = uiCamera; FPlatform.CursorCamera = cursorCamera; }