Странное поведение камеры при вращении вокруг игрока - PullRequest
0 голосов
/ 10 февраля 2020

Я собираюсь использовать камеру в стиле RuneScape, которая вращается вокруг игрока, используя WASD . Вращение по горизонтали работает хорошо, но когда я смешиваю два (как при наклоне вверх или вниз), камера вращается вокруг игрока очень неловко, камера может перевернуться или, скорее всего, будет карданным подвесом.

Вот мой код:

public float pitch;
public float zoomSpeed = 4f;
public float minZoom = 5f;
public float maxZoom = 15f;
public Transform target;
public Vector3 offset;
public float yawSpeed = 100f;

private float currentZoom = 10f;
private float currentYaw = 0f;
private float currentPitch = 0f;

void Update()
{
    currentZoom -= Input.GetAxis("Mouse ScrollWheel") * zoomSpeed;
    currentZoom = Mathf.Clamp(currentZoom, minZoom, maxZoom);

    currentYaw -= Input.GetAxis("Horizontal") * yawSpeed * Time.deltaTime;
    currentPitch -= Input.GetAxis("Vertical") * yawSpeed * Time.deltaTime;              

    Debug.Log("Yaw: " + currentYaw + " Pitch: " + currentPitch);
}

void LateUpdate()
{
    transform.position = target.position - offset * currentZoom;
    transform.LookAt(target.position + Vector3.up * pitch);

    transform.RotateAround(target.position, Vector3.up, currentYaw);
    transform.RotateAround(target.position, Vector3.forward, currentPitch); 
}

Любая помощь будет с благодарностью!

1 Ответ

0 голосов
/ 10 февраля 2020

Мне кажется, что вы используете currentPitch, но вращаете его вокруг передней оси? Что может вызвать поворот на оси мирового движения?

Если ваш вектор роста всегда направлен вверх, то ваш рывок будет работать. Но то, что вы хотите сделать, это пересчитать правильный вектор от вашего текущего местоположения до вашей цели после того, как вы примените рыскание.

void LateUpdate() {
    transform.position = target.position - offset * currentZoom;
    transform.LookAt(target.position + Vector3.up * pitch);

    transform.RotateAround(target.position, Vector3.up, currentYaw);
    transform.RotateAround(target.position, Vector3.Cross((target.position - transform.position).normalized, Vector3.up), currentPitch);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...