Как я могу применить нормализацию к значениям vector3/float3 с величиной больше 1?

#unity3d #vector

Вопрос:

Я пытаюсь создать какой-то алгоритм, который вычисляет пользовательскую гравитацию. Для того,чтобы он работал так,как я хочу, я хочу, чтобы мой входной вектор был равен (-1, -1, -1) или ( 1, 1, 1). Если я использую функцию нормализации,она превратится в (0.6, 0.6,0.6). Я не могу просто зажать это, иначе ориентация вектора изменится.

Мой вопрос в том, есть ли встроенная функция для этого? Или мне нужно просто выполнить математику нормализации самостоятельно?

Ответ №1:

Я не думаю, что для этого есть встроенная функция.

Вот идея о том, как написать его в качестве метода расширения:

 public static class VectorX {
    public static Vector3 SquareNormalize (this Vector3 vector) {
        var bounds = new Bounds(Vector3.zero, Vector3.one * 2f);
        return bounds.ClosestPoint(vector);
    }
}
 

И чтобы воспользоваться им звоните:

 myVector.SquareNormalize();
 

Ответ №2:

Я сделал это вот так:

 using Unity.Mathematics;
using static Unity.Mathematics.math;

public static class CustomMathHelper
{
    public static float3 ClampNormalize(float3 value, float normalizeLimit)
    {
        var maxValue = max(abs(value.x), max(abs(value.y), abs(value.z)));
        if (maxValue > abs(normalizeLimit))
        {
            var factor = (1 / maxValue) * abs(normalizeLimit);
            return new float3(factor * value.x, factor * value.y, factor * value.z);
        }

        return value;
    }
}
 

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