Создание рекурсивной функции для получения равномерно расположенных векторов на трехмерной «линии» - PullRequest
0 голосов
/ 20 апреля 2020

У меня есть 3D-объект, который по сути представляет собой линию, состоящую из неравномерно расположенных векторов Vector3s. То, что я пытаюсь сделать, это разместить метки равномерно вдоль объекта с заданным интервалом расстояния.

В настоящее время я прохожу через указанные векторы и суммирую расстояния до тех пор, пока я не пройду заданный интервал, а затем я использую функцию, чтобы определить, где разместить вектор на линии в правильный интервал Часть, которую я не могу получить, это когда я создаю новый вектор, но расстояние до следующего Vector3 в списке все еще больше, чем интервал. Мне нужна какая-то функция рекурсии (я думаю), но я до сих пор не смог ее понять. Рассматриваемая часть в то время как l oop ниже. Вот код:

private void GetVerticesAtGivenIntervals(float interval, Vector3[] transformedVertices)
{
    float totalDistance = 0;
    float prevDistance = 0;

    for (int i = 0; i < transformedVertices.Length; i++) // loop through the vertices of the mesh model
    {
        if (i == 0 || i == (transformedVertices.Length - 1)) // skip if first or last vertex
        {
            continue;
        }
        else
        {
            // first get the distance between the current and next vectors
            float distanceToNextVector = Vector3.Distance(transformedVertices[i], transformedVertices[i + 1]);

            totalDistance += distanceToNextVector; // add their distance to the total distance traveled so far
            if (totalDistance > interval) // if the total distance traveled is greater than the distance interval
            {
                // Get the percentage needed to travel to hit a Vector on the line that is the correct interval away.
                float percentToInterval = GetPercentageOfDistanceInterval(prevDistance, totalDistance, interval); 

                // Next, get a vector on the line at the specified distance between the two vectors
                Vector3 newVector = Vector3.Lerp(transformedVertices[i - 1], transformedVertices[i], percentToInterval);

                // Create label in this part of code with  newVector

                // reset the distance to 0
                totalDistance = 0;
                prevDistance = 0;

                // Get the distance from the new Vector to the next vector in the list
                float newDistance = Vector3.Distance(newVector, transformedVertices[i + 1]);

                // Need to check if the new vector's distance to the next vector in the list is less than the given interval, if it is we can continue like normal
                if (newDistance  < interval)
                {
                    totalDistance += newDistance;
                    prevDistance = totalDistance;
                }
                else // stuck here, not sure what to do
                {
                    while (Vector3.Distance(newVector, transformedVertices[i + 1]) > interval)
                    {
                    }
                }
            }
            else
            {
                prevDistance = totalDistance;
            }
        }
    }
}

/// <summary>
/// Gets the percentage needed to travel along a line to reach the given distance interval.
/// Ex: Interval is 125. Distance to next vector is 50. Previous distance is 100. So total distance is 150. 150 is greater than 125.
/// 125 - 100 = 25. 150 - 100 = 50. 25 / 50 = .5 = 50%.
/// So you need to move 50% from the current vector towards the next vector to reach a distance of 125.
/// </summary>
private float GetPercentageOfDistanceInterval(float prevDistance, float totalDistance, float distanceInterval)
{
    float value1 = distanceInterval - prevDistance;
    float value2 = totalDistance - prevDistance;

    float finalValue = value1 / value2;
    return finalValue;
}
...