OBJETIVO
Estoy usando este script que obtuve de los foros de Unity para mover mi cámara. Funciona perfectamente y este es exactamente el estilo de cámara que quiero. Aquí está en acción:
https://streamable.com/j7ozps
Quería crear un efecto de zoom cuando el usuario mantiene presionado el botón derecho del mouse.
PROBLEMA
Después de hacer zoom, el objetivo se desvía mucho. Esto es lo que sucede:
https://streamable.com/8aiil0
MI INTENTO
void Update () {
if (Input.GetMouseButton(1))
{
int layerMask = 1 << CombatManager.GROUND_LAYER; // -> public const int GROUND_LAYER = 8;
Ray mouseClick = Camera.main.ScreenPointToRay(Input.mousePosition);
RaycastHit[] hitInfos;
float maxDistance = 100.0f;
hitInfos = Physics.RaycastAll(mouseClick, maxDistance,
layerMask, QueryTriggerInteraction.Ignore);
mainCamera.fieldOfView = 10;
mainCamera.transform.LookAt(hitInfos[0].point);
}
else
mainCamera.fieldOfView = startingFieldOfView;
También intenté cambiar el orden de LookAt y la asignación del campo de visión.
¿Qué estoy haciendo mal?
Solución del problema
Parece que lo que desea es hacer zoom hacia la posición del cursor, no hacia donde golpea el rayo, que probablemente no sea el mismo punto. Para verificar eso, puede dibujar un cubo de depuración donde golpea el rayo, para verificar si el punto que está mirando es el que necesita, así:
GameObject cube = GameObject.CreatePrimitive(PrimitiveType.Cube);
cube.transform.position = hitInfos[0].point;
Verifique Camera.ScreenToWorldPoint que le brinda el punto del espacio mundial creado al convertir el punto del espacio de la pantalla a la distancia z proporcionada desde el plano de la cámara.
Lo que intentaría:
Vector3 point = Camera.main.ScreenToWorldPoint(Input.mousePosition);
//check if this is the point you want to look at
GameObject cube = GameObject.CreatePrimitive(PrimitiveType.Cube);
cube.transform.position = point;
//look at it
mainCamera.transform.LookAt(point);
No debería importar si está utilizando cam.nearClipPlaneo cam.farClipPlaneen la ScreenToWorldPointfunción, pero jugaría con eso en caso de que algo no funcione como se esperaba.
Vector3 screenPoint = Input.mousePosition;
screenPoint.z = Camera.main.farClipPlane;
Vector3 worldPoint = Camera.main.ScreenToWorldPoint(screenPoint);
No hay comentarios:
Publicar un comentario