/// <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); }