Повернуть объект к цели, при этом повернув его в соответствии с уклоном местности - PullRequest
0 голосов
/ 06 мая 2020

alt text

На изображении выше

  • красный вектор - это прямой вектор паука
  • синий вектор - это вектор, представляющий направление между паук и его цель

В приведенном ниже коде orientation - это вектор, представляющий нормаль ландшафта, так что паук выравнивается по нему:

    Vector3 orientation = GetTerrainNormal();

    Quaternion rotationNeeded = Quaternion.FromToRotation(Vector3.up, orientation);

    transform.rotation = Quaternion.RotateTowards(
                transform.rotation,
                rotationNeeded,
                RotationSpeed * Time.deltaTime
    );

Моя проблема в том, что мне не удается заставить паука стоять лицом к своей цели ... Когда я добавляю какой-либо код, который заставил бы его вращаться к нему, он больше не выровнен с нормалями ландшафта, он говорит прямо ...

Итак, в основном, как я могу заставить паука вращаться по мировой оси Y (я думаю), при этом все еще вращаясь, чтобы соответствовать наклону?


Полный ответ

In если это помогает кому-то другому, вот полный ответ:

        Vector3 orientation = GetTerrainNormal();
        Vector3 directionToTarget = (target.position - transform.position).Y(0);
        float d = Vector3.Dot(directionToTarget, orientation);
        directionToTarget -= d * orientation;
        if (directionToTarget.sqrMagnitude > 0.00001f) {
            directionToTarget.Normalize();
            Quaternion rotationNeeded = Quaternion.LookRotation(directionToTarget, orientation);

            transform.rotation = Quaternion.RotateTowards(
                transform.rotation,
                rotationNeeded,
                xRotationSpeed * Time.deltaTime
            );
        }

Этот ответ на форумах единства был чрезвычайно полезен: https://forum.unity.com/threads/look-at-object-while-aligned-to-surface.515743/

Ответы [ 2 ]

1 голос
/ 06 мая 2020

Попробуйте это

Vector3 directionToTarget = target.transform.position - transform.position;
Quaternion rotationNeeded = Quaternion.LookRotation(directionToTarget, orientation);
0 голосов
/ 06 мая 2020

Прежде всего, я не уверен, зачем вам нужен код, чтобы вручную ориентировать паука на местность. Вы можете сделать паука Rigidbody, и движок Unity позаботится об этом за вас.

В любом случае, вы хотите повернуть паука вокруг локальной оси Y (это будет сохранить текущую ориентацию).

Вы можете сделать это, используя transform.LookAt() (ссылаясь на синий вектор на картинке) ( задокументировано здесь ) и передав вектор вверх в качестве второго аргумента.

...