Нахождение последнего вектора прямоугольного треугольника - Единство - PullRequest
0 голосов
/ 10 ноября 2018

Для контекста: я на 90% прошел через создание настенной системы в Unity, и мне нужна помощь в поиске 2-х векторов, которые я могу использовать для проверки и для добавления скорости к игроку, чтобы заставить их двигаться в правильное направление.

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

В настоящее время я использую эту функцию, чтобы сделать это для меня (где попадание - это точка контакта между игроком и стеной):

Vector3 CalculateWallRunDirection(Vector3 hit, Transform wall)
{

    Vector3 rightPos = hit + wall.forward;
    Vector3 leftPos = hit + (wall.forward * -1);

    float rightDis = Vector3.Distance(rightPos, prevPlayerPos);
    float leftDis = Vector3.Distance(leftPos, prevPlayerPos);

    if (rightDis < leftDis)
    {
        return Vector3.Normalize(leftPos - hit);
    }
    else
    {
        return Vector3.Normalize(rightPos - hit);
    }

}

Это хорошо работает, когда работает ... но проблема в том, что я использую Transform.forward стены, чтобы определить, где находятся эти точки, если вы пытаетесь обойти стену на передней или задней грани объект, он бросит в стену, а не вдоль него, и игрок застрянет.

TL; DR: мне нужен другой способ определения двух векторов вместо использования transform.forward + оригинальный вектор3. Если смотреть сверху вниз, проблема может отображаться как this . A - игрок, B - точка контакта со стеной. Найдите C и D:

Пожалуйста, объясните свой ответ, я не слишком хорош в математике.

1 Ответ

0 голосов
/ 10 ноября 2018

Вы пытались воссоздать Vector3.ProjectOnPlane () . Вы, вероятно, хотите использовать это вместо.

например

Vector3 A = Vector3.ProjectOnPlane(B, C);
// A is the new velocity vector parallel to the wall
// B is the old velocity of the player at the point of impact
// C is the normal of the plane of impact

Вы можете легко найти C в событии OnCollisionEnter, просто получите нормальную точку контакта.

Примечание. B не нужно нормализовать, но если это так, то A также будет нормализованным Vector3.

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