Unity LookAt, но вместо этого вращайте все тело в направлении в трехмерном пространстве - PullRequest
1 голос
/ 06 ноября 2019

Потрачено много часов, пытаясь выяснить ротацию, и много часов в поисках ответов, но не смог найти ничего подходящего моей проблеме. Мне нужно повернуть весь gameObject в определенном направлении, а не вращать по оси y:

Examples of wanted rotations

1) Как объект вращается в настоящее время, когда ему дано направление внутри Quaternion.LookRotation илиАтан2. 2,3) Примеры того, как оно должно вращаться. Красная точка симболизирует точку поворота, из которой происходит вращение

Не так много кода, чтобы показать, так как в нем не так много, кроме преобразований gameObject, которые вращаются, и направление, в котором вращается gameObject.

По запросу

[System.Serializable]
public class ToRotate
{
    //Object which will be rotated by the angle
    public GameObject gameObject;
    //Object last known position of this object. The object is rotated towards it's last global position
    private Vector3 lastPosition;

    //Initializes starting world position values to avoid a strange jump at the start.
    public void Init()
    {
        if (gameObject == null)
            return;

        lastPosition = gameObject.transform.position;
    }

    //Method which updates the rotation
    public void UpdateRotation()
    {
        //In order to avoid errors when object given is null.
        if (gameObject == null)
            return;
        //If the objects didn't move last frame, no point in recalculating and having a direction of 0,0,0
        if (lastPosition == gameObject.transform.position)
            return;

        //direction the rotation must face
        Vector3 direction = (lastPosition - gameObject.transform.position).normalized;

        /* Code that modifies the rotation angle is written here */

        //y angle
        float angle = Mathf.Rad2Deg * Mathf.Atan2(direction.x, direction.z);

        Quaternion rotation = Quaternion.Euler(0, angle, 0);
        gameObject.transform.rotation = rotation;

        lastPosition = gameObject.transform.position;
    }
}

1 Ответ

0 голосов
/ 07 ноября 2019

Так как вы хотите, чтобы локально вниз объекта указывал в рассчитанном направлении, сохраняя при этом локальное значение вправо неизменным, насколько это возможно, я бы использовал Vector3.Cross чтобы найти перекрестное произведение этих вниз и вправо , чтобы определить направление, в котором должен быть направлен локальный объект вперед , затем используйте Quaternion.LookRotation чтобы получить соответствующее вращение:

//Method which updates the rotation
public void UpdateRotation()
{
    //In order to avoid errors when object given is null.
    if (gameObject == null)
        return;
    //If the objects didn't move last frame, no point in recalculating and having a direction of 0,0,0
    if (lastPosition == transform.position)
        return;

    //direction object's local down should face
    Vector3 downDir = (lastPosition - transform.position).normalized;

    // direction object's local right should face
    Vector3 rightDir = transform.right;

    // direction object's local forward should face
    Vector3 forwardDir = Vector3.Cross(downDir, rightDir);

    transform.rotation = Quaternion.LookRotation(forwardDir, -downDir);

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