Unity: камера дергается / дергается при использовании сенсорного захвата для перемещения вращения - PullRequest
3 голосов
/ 20 мая 2019

Используя Unity, я пытаюсь переместить вращение турелей с помощью камеры от первого лица с помощью касания, я берусь от края экрана к центру в направлении, которое я хочу выбрать, как на картах Google, сенсорный захват перемещает мой камера там плавно.

Проблема в том, что камера очень дергается, а не в плавном положении.

In Global

private float smoothTouchFactor = 5;

Это код, который я использую в Update()

Quaternion rotation;

if (Input.touchCount > 0)
{
    if (Input.GetTouch(0).phase == TouchPhase.Moved)
    {
        Touch touch = Input.GetTouch(0);
        x += touch.deltaPosition.x * xSpeed * 0.02f;
        y -= touch.deltaPosition.y * ySpeed * 0.02f;

        rotation = Quaternion.Euler(y, x, 0f);
        turretHeadToMove.rotation = Quaternion.Slerp(turretHeadToMove.rotation, rotation, Time.deltaTime * smoothTouchFactor);
    }
}

rotation = Quaternion.Euler(y, x, 0f);
turretHeadToMove.rotation = Quaternion.Slerp(turretHeadToMove.rotation, rotation, Time.deltaTime * smoothTouchFactor);

Если я не добавляю последние 2 строки после if (touchCount), то камера возвращается в исходное положение после того, как я убираю палец с экрана.


Вот код мышиной оси X / Y, который работает и плавно перемещает револьверную головку без рывков.

private float xSpeed = 40.0f;
private float ySpeed = 40.0f;

in Update()
x += Input.GetAxis("Mouse X") * xSpeed * 0.02f;
y -= Input.GetAxis("Mouse Y") * ySpeed * 0.02f;

Quaternion rotation = Quaternion.Euler(y, x, 0f);
turretHeadToMove.rotation = rotation;

1 Ответ

3 голосов
/ 20 мая 2019

Из вашего описания необходимости этих "двух строк" в конце кажется, что у вас есть код в другом месте, который постоянно пытается сбросить их вращение. Таким образом, мы добавляем переменную, чтобы rotation соответствовал Quaternion, установленному в последний раз, когда было выполнено сенсорное управление, и просто обязательно присвойте его turretHeadToMove.rotation перед обработкой сенсорного управления.

Затем вы можете использовать Euler, чтобы создать Quaternion того, сколько вы хотите повернуть этот кадр. А затем умножьте текущее вращение на эту величину, чтобы получить новое вращение

В целом это может выглядеть так:

как поле:

private Quaternion savedRotation = Quaternion.identity;

В Update:

// Add it before the block so that modifications to `localRotation` are consistent with memory
turretHeadToMove.rotation = savedRotation;

if (Input.touchCount > 0)
{
    if (Input.GetTouch(0).phase == TouchPhase.Moved)
    {
        Touch touch = Input.GetTouch(0);
        Quaternion previousRotation = turretHeadToMove.rotation;

        Quaternion rotationThisFrame = Quaternion.Euler(
                 touch.deltaPosition.y * ySpeed, 
                 touch.deltaPosition.x * xSpeed, 0f);

        turretHeadToMove.rotation = previousRotation * rotationThisFrame;

        savedRotation = turretHeadToMove.rotation;
    }
}
...