Example #1
0
        /// <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);
            }
        }
Example #2
0
        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);
        }
Example #3
0
        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);
        }
Example #4
0
        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);
        }
Example #5
0
        /// <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);
                }
            }
        }
Example #6
0
        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);
        }