/// <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 void SceneTumbleAround(FScene scene, Vector3f position, float dx, float dy) { Vector3 targetPos = Camera.GetTarget(); Camera.SetTarget(position); SceneTumble(scene, Camera, dx, dy); Camera.SetTarget(targetPos); }
public void SceneOrbit(FScene scene, fCamera cam, float deltaAzimuth, float deltaAltitude, bool bSet = false) { //Vector3f sceneOrigin = scene.RootGameObject.transform.position; Vector3f rotTarget = cam.GetTarget(); // [RMS] Orbiting around the Target point is kind of a weird concept when // you are moving the scene and not the camera. Basically we want to rotate // the scene around the target, but not incrementally - based on a pair of // spherical angles. So, we have to return to a 'reference' state each update. // Simplest way to do that is to "un-rotate" by the angles before the delta... // (???) Vector3f up = Vector3f.AxisY; Vector3f right = cam.Right(); scene.RootGameObject.RotateAroundD(rotTarget, right, -turntableAltitudeD); scene.RootGameObject.RotateAroundD(rotTarget, up, -turntableAzimuthD); if (bSet) { turntableAzimuthD = deltaAzimuth; turntableAltitudeD = deltaAltitude; } else { turntableAzimuthD -= deltaAzimuth; turntableAltitudeD += deltaAltitude; } turntableAzimuthD = (float)MathUtil.ClampAngleDeg(Convert.ToDouble(turntableAzimuthD), -360d, 360d); turntableAltitudeD = Mathf.Clamp(turntableAltitudeD, -89.9f, 89.9f); scene.RootGameObject.RotateAroundD(rotTarget, up, turntableAzimuthD); scene.RootGameObject.RotateAroundD(rotTarget, right, turntableAltitudeD); }
public void SceneTumble(FScene scene, fCamera cam, float dx, float dy) { Vector3f up = cam.Up(); Vector3f right = cam.Right(); //Vector3 curOrigin = scene.RootGameObject.transform.position; Vector3f curOrigin = cam.GetTarget(); scene.RootGameObject.RotateAroundD(curOrigin, up, dx); scene.RootGameObject.RotateAroundD(curOrigin, right, dy); }
/// <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 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); }