Beispiel #1
0
        /// <summary>
        /// Actualiza los valores de la camara
        /// </summary>
        public void updateCamera()
        {
            //Si la camara no está habilitada, no procesar el resto del input
            if (!enable)
            {
                return;
            }

            float       elapsedTimeSec = GuiController.Instance.ElapsedTime;
            TgcD3dInput d3dInput       = GuiController.Instance.D3dInput;

            //Imprimir por consola la posicion actual de la camara
            if ((d3dInput.keyDown(Key.LeftShift) || d3dInput.keyDown(Key.RightShift)) && d3dInput.keyPressed(Key.P))
            {
                GuiController.Instance.printCurrentPosition();
                return;
            }


            float heading = 0.0f;
            float pitch   = 0.0f;

            //Obtener direccion segun entrada de teclado
            Vector3 direction = getMovementDirection(d3dInput);

            pitch   = d3dInput.YposRelative * rotationSpeed;
            heading = d3dInput.XposRelative * rotationSpeed;

            //Solo rotar si se esta aprentando el boton del mouse configurado
            if (d3dInput.buttonDown(rotateMouseButton))
            {
                rotate(heading, pitch, 0.0f);
            }


            updatePosition(direction, elapsedTimeSec);
        }
        /// <summary>
        /// Actualiza los valores de la camara
        /// </summary>
        public void updateCamera()
        {
            if (!enable)
            {
                return;
            }

            TgcD3dInput d3dInput    = GuiController.Instance.D3dInput;
            float       elapsedTime = GuiController.Instance.ElapsedTime;

            //Obtener variacion XY del mouse
            float mouseX = 0f;
            float mouseY = 0f;

            if (d3dInput.buttonDown(TgcD3dInput.MouseButtons.BUTTON_LEFT))
            {
                mouseX = d3dInput.XposRelative;
                mouseY = d3dInput.YposRelative;

                diffX += mouseX * elapsedTime * rotationSpeed;
                diffY += mouseY * elapsedTime * rotationSpeed;
            }
            else
            {
                diffX += mouseX;
                diffY += mouseY;
            }



            //Calcular rotacion a aplicar
            float rotX = (-diffY / FastMath.PI);
            float rotY = (diffX / FastMath.PI);

            //Truncar valores de rotacion fuera de rango
            if (rotX > FastMath.PI * 2 || rotX < -FastMath.PI * 2)
            {
                diffY = 0;
                rotX  = 0;
            }

            //Invertir Y de UpVector segun el angulo de rotacion
            if (rotX < -FastMath.PI / 2 && rotX > -FastMath.PI * 3 / 2)
            {
                upVector.Y = -1;
            }
            else if (rotX > FastMath.PI / 2 && rotX < FastMath.PI * 3 / 2)
            {
                upVector.Y = -1;
            }
            else
            {
                upVector.Y = 1;
            }


            //Determinar distancia de la camara o zoom segun el Mouse Wheel
            if (d3dInput.WheelPos != 0)
            {
                diffZ += zoomFactor * d3dInput.WheelPos * -1;
            }
            float distance = -cameraDistance * diffZ;

            //Limitar el zoom a 0
            if (distance > 0)
            {
                distance = 0;
            }


            //Realizar Transformacion: primero alejarse en Z, despues rotar en X e Y y despues ir al centro de la cmara
            Matrix m = Matrix.Translation(0, 0, -distance)
                       * Matrix.RotationX(rotX)
                       * Matrix.RotationY(rotY)
                       * Matrix.Translation(cameraCenter);


            //Extraer la posicion final de la matriz de transformacion
            nextPos.X = m.M41;
            nextPos.Y = m.M42;
            nextPos.Z = m.M43;


            //Hacer efecto de Pan View
            if (d3dInput.buttonDown(TgcD3dInput.MouseButtons.BUTTON_RIGHT))
            {
                float dx           = -d3dInput.XposRelative;
                float dy           = d3dInput.YposRelative;
                float panSpeedZoom = panSpeed * FastMath.Abs(distance);

                Vector3 d = cameraCenter - nextPos;
                d.Normalize();

                Vector3 n = Vector3.Cross(d, upVector);
                n.Normalize();

                Vector3 up   = Vector3.Cross(n, d);
                Vector3 desf = Vector3.Scale(up, dy * panSpeedZoom) - Vector3.Scale(n, dx * panSpeedZoom);
                nextPos      = nextPos + desf;
                cameraCenter = cameraCenter + desf;
            }

            //Obtener ViewMatrix haciendo un LookAt desde la posicion final anterior al centro de la camara
            viewMatrix = Matrix.LookAtLH(nextPos, cameraCenter, upVector);
        }