Unity RotateAround () в сочетании с определенным направлением - PullRequest
0 голосов
/ 08 января 2019

Я пытаюсь повернуть камеру вокруг персонажа в определенном направлении, к которому он должен повернуться. Например, я хочу, чтобы моя камера вращалась вокруг моего персонажа и прекращала вращение, когда она обращена к передней оси другого объекта. Поэтому я решил, что мне нужно сочетание между RotateAround () и LookRotation (). RotateAround (), чтобы повернуть камеру вокруг персонажа, и LookRotation (), чтобы заставить камеру смотреть на этот объект, а также.

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

Я попробовал пару вещей, наиболее продуманным из которых было следующее:

private void RotateCamera()
{
    Quaternion currentCameraRotation = _camera.transform.rotation;
    Quaternion futureCameraRotation = Quaternion.LookRotation(_hitObstacleStartingPoint.transform.forward);
    float rotationAngle;
    Vector3 rotationAxis;
    Quaternion.FromToRotation(currentCameraRotation.eulerAngles, futureCameraRotation.eulerAngles).ToAngleAxis(out rotationAngle, out rotationAxis);
    _camera.transform.RotateAround(_character.transform.position, _camera.transform.up, rotationAngle);
}

Но это закончилось тем, что моя камера вращалась повсюду ..

Заранее спасибо!

РЕДАКТИРОВАТЬ: Я прошу прощения за мое ужасное объяснение. Вот маленький рисунок. enter image description here

Ответы [ 2 ]

0 голосов
/ 10 января 2019

Я использовал фиксированные точки камеры в моей сцене. Это позволяет избежать проблемы, поэтому я не считаю эту проблему решенной, но у меня есть крайний срок для этого проекта, и я не могу позволить себе тратить слишком много времени на эту проблему. Спасибо тем из вас, кто помог мне.

0 голосов
/ 09 января 2019

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

См. Ниже:

private void RotateCamera()
{
    Quaternion currentCameraRotation = _camera.transform.rotation;
    Quaternion futureCameraRotation = Quaternion.LookRotation(obstacleObject.transform.forward, obstacleObject.transform.up);

    float angleDelta = Quaternion.Angle(currentCameraRotation, futureCameraRotation);

    _camera.transform.RotateAround(this._character.transform.position, _camera.transform.up, angleDelta * rotationSpeed * Time.deltaTime);        
}

Чтобы помочь визуализировать происходящее:

void OnDrawGizmos()
{
    Gizmos.color = Color.green;
    Gizmos.DrawLine(_camera.transform.position, _camera.transform.forward * 20 + _camera.transform.position);

    Gizmos.color = Color.red;
    Gizmos.DrawLine(obstacleObject.transform.position, obstacleObject.transform.forward * 20 + obstacleObject.transform.position);
}

Это не работает, если ваше препятствие вращается вокруг x, z; это всегда предполагает тождественный вектор вперед.

...