Unity3d - «ошибка» сглаживания вращения камеры - PullRequest
0 голосов
/ 12 мая 2018

Я сделал простую гоночную игру. Камера следует за автомобилем (игроком), и ее положение и поворот основаны на повороте Y автомобиля. Я хочу сгладить поворот камеры, но когда она пересекает точку 0 градусов, она поворачивается на 360 градусов. Вот код:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Camera : MonoBehaviour {
    public Transform camera, player;


    void Update() {
        Vector3 cameraPosition = camera.transform.position;
        float cameraRotation = camera.eulerAngles.y;
        float playerRotation = player.eulerAngles.y;
        Vector3 playerPosition = player.transform.position;
        cameraPosition.x = (Mathf.Sin((playerRotation / 180) * Mathf.PI) * -6 + player.position.x);
        cameraPosition.y = playerPosition.y + 2.5f;
        cameraPosition.z = (Mathf.Cos((playerRotation / 180) * Mathf.PI) * -6 + player.position.z);
        camera.transform.position = cameraPosition;
        cameraRotation = cameraRotation + (playerRotation-cameraRotation)/2;
        camera.localRotation = Quaternion.Euler(20f, cameraRotation, 0f);
    }
}

Я понял, что это вращение вызвано скриптом сглаживания:

 cameraRotation = cameraRotation + (playerRotation-cameraRotation)/2;

Как предотвратить это нежелательное вращение?

Ответы [ 2 ]

0 голосов
/ 14 мая 2018

Более простым решением для использования Slerp является использование Mathf.SmoothDamp, который имеет вариант с именем Mathf.SmoothDampAngle, который правильно обрабатывает цикл.Я также имел успех, делая обход вручную, но это не очень полезный опыт

using UnityEngine;
public class RotFollow : MonoBehaviour
{
    [SerializeField] Transform carTransform;
    [SerializeField] float smoothTime = .4f; 

    float currentYAngle;
    float targetYAngle;
    float angleVel;
    void Update()
    {
        targetYAngle = carTransform.rotation.eulerAngles.y;
        currentYAngle =  Mathf.SmoothDampAngle(currentYAngle, targetYAngle, ref angleVel, smoothTime);
        transform.rotation = Quaternion.Euler(
                                        transform.rotation.eulerAngles.x,
                                        currentYAngle, 
                                        transform.rotation.eulerAngles.z);
        }
    }
0 голосов
/ 12 мая 2018

Вот как бы я это сделал:

public int smoothSpeed = 1f; // Change accordingly to increase/decrease smooth speed.

Тогда в обновлении:

Vector3 directionToCar = player.position - camera.position;
Quaternion desiredRotation = Quaternion.LookRotation(directionToCar);
camera.rotation = Quaternion.Slerp(camera.rotation, desiredRotation, Time.deltaTime * smoothSpeed);

На боковом узле, если этот скрипт камеры прикреплен к камере, вам не нужно создавать поле, ссылающееся на преобразование камеры. Вы можете просто сделать transform.position вместо camera.transform.position.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...