Noticias

¡RECUERDA QUE SI ERES UN NUEVO USUARIO, DEBES PRESENTARTE PARA PODER PUBLICAR MENSAJES! | TENEMOS CANAL OFICIAL DE TELEGRAM: t.me/unity3dspain

Duda sobre "clampear" la cámara

Iniciado por Null, Junio 01, 2016, 08:06:45 PM

Tema anterior - Siguiente tema
Hola.

 
 
Tengo un script para la cámara de mi player,

pero el problema es que al girar la vista hacia abajo o hacia arriba,

como que no existe un tope.


Ya sé que el código que se utiliza es Mathf.Clamp(etc, etc, etc),

pero todavía soy medio nuevo con esto y no encuentro en qué parte

de mi código escribirlo.


Esto es lo que tengo hecho:

 
 

using UnityEngine;
using System.Collections;
public class ControladorCamara : MonoBehaviour
{
GameObject jugador;
Vector2 vistaMouse;
Vector2 vistaSmooth;
public float sensibilidad = 2f;
public float suavidad = 1f;
public static float _velocidadLerp;
public static float _fovActual;
public static float _fovAumento;
 
void Awake()
{
   _velocidadLerp = 4f;
   _fovActual = 60f;
   _fovAumento = _fovActual * 1.5f;
   jugador = this.transform.parent.gameObject;
}
void Update()
{
   VistaMouse();
   FOVCorrer();
}
 
void VistaMouse()
{
   Vector2 inputsMouse = new Vector2(Input.GetAxis("Mouse X"), Input.GetAxis("Mouse Y"));
 
   inputsMouse = Vector2.Scale(inputsMouse, new Vector2(sensibilidad * suavidad, sensibilidad * suavidad));
   vistaSmooth.x = Mathf.Lerp(vistaSmooth.x, inputsMouse.x, 1f / suavidad);
   vistaSmooth.y = Mathf.Lerp(vistaSmooth.y, inputsMouse.y, 1f / suavidad);
   vistaMouse += vistaSmooth;
   transform.localRotation = Quaternion.AngleAxis(-vistaMouse.y, Vector3.right);
   jugador.transform.localRotation = Quaternion.AngleAxis(vistaMouse.x, jugador.transform.up);
}
void FOVCorrer()
{
   if (ControladorJugador.estaCorriendo == true && ControladorJugador._estaQuieto == false)
   {
      Camera.main.fieldOfView = Mathf.Lerp(Camera.main.fieldOfView, _fovAumento, _velocidadLerp * Time.deltaTime);
   }
   else if (ControladorJugador.estaCorriendo == false && ControladorJugador._estaQuieto == true)
   {
      Camera.main.fieldOfView = Mathf.Lerp(Camera.main.fieldOfView, _fovActual, _velocidadLerp * Time.deltaTime);
   }
}
}

 
 
 
Siento que me va a explotar un ojo jojojo.

Entiendo que el problema se encuentra dentro de "VistaMouse()",

pero pues hoy no doy ni una.

He intentado con todo.

 
 
Gracias <3

Usa el Clamp justo antes de asignar la nueva rotación al Transform.

Cita de: juanma_teso date=1464808788Usa el Clamp justo antes de asignar la nueva rotación al Transform.
   


Te refieres a antes de
 

transform.localRotation = Quaternion.AngleAxis(-vistaMouse.y, Vector3.right);

 
?


Cita de: juanma_teso date=1464875688Si, has hecho la prueba?
   


He probado con esto:


 
 

void VistaMouse()
{
Vector2 inputsMouse = new Vector2(Input.GetAxis("Mouse X"), Input.GetAxis("Mouse Y"));
 
inputsMouse = Vector2.Scale(inputsMouse, new Vector2(sensibilidad * suavidad, sensibilidad * suavidad));
vistaSmooth.x = Mathf.Lerp(vistaSmooth.x, inputsMouse.x, 1f / suavidad);
vistaSmooth.y = Mathf.Lerp(vistaSmooth.y, inputsMouse.y, 1f / suavidad);
vistaMouse += vistaSmooth;
vistaSmooth.x = Mathf.Clamp(vistaSmooth.x, -90f, 90f);    // <---
transform.localRotation = Quaternion.AngleAxis(-vistaMouse.y, Vector3.right);
jugador.transform.localRotation = Quaternion.AngleAxis(vistaMouse.x, jugador.transform.up);
}

 
pero sigue igual la cámara.

Algo ando haciendo mal.

Creo que deberías aplicar el Clamp al vistaMouse no al vistaSmooth...

Junio 03, 2016, 03:40:22 PM #6 Ultima modificación: Junio 03, 2016, 03:44:01 PM por francoe1
El problema se debe a que el valor que deseas clampear no justamente trabaja de 90 a -90. Si rotas en el eje X un objeto en sentido de agujas del reloj el valor se incrementa, es decir 1 -> 2 -> 3 -> Etc, pero si la rotación es al sentido contrario el valor empieza a disminuir a partir de 360, es decir 360 -> 359 -> 358, viéndolo de esta manera te podrás dar cuenta que es imposible clampear este valor sin contemplar dicho evento, para esto la fórmula de limitar ángulos.
 
Necesitas el Ángulo actual, y los valores de limitación, Mínimo y Máximo.
 
1- Comprobar si Ángulo es < a -360, de ser así entonces se le suma 360.
 
2- Comprobar si Ángulo es > a 360, de ser así se le resta 360.
 
3- Utilizando la función Clamp incluida en la librería de Unity Mathf, realizamos las limitacion.
 
Ejemplo 
 

private float LimitAngle(float Angle, float Min, float Max)
{
if(Angle < -360) Angle += 360;
      if(Angle > 360) Angle -= 360;
    return Mathf.Clamp(Angle, Min, Max);
}

 
De esta manera puedes aplicar una limitación en los ángulos de rotación.
 
Existe una alternativa diferente para rotar la cámara, esta es aún más utilizada que la anterior, se trata de modificar el EulerAngle de la Cámara, estos valores si van de ++ 0,1,2 y -- 0,-1,-2, entonces se pueden limitar naturalmente con el método Clamp de Unity.
 
Ejemplo
 

private void RotateCamera()
{
Vector3 currenEulerAngle = cam.transform.eulerAngle;
var mouseY = Input.GetAxis("Mouse Y") * MouseSensivity;
     currenEulerAngle.x = Mathf.Clamp(currenEulerAngle.x + MouseY, MinRotation, MaxRotation);
     cam.transform.eulerAngle = currenEulerAngle;
}

 
Espero que esta info te ayude.
 
Vas a encontrar mas material en : Mi blog
 
Saludos

Etiquetas: