#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;
}
}
оставляя вопрос нерешенным на случай, если кто-то столкнется с методом фреймворка, который уже это делает