Как заставить геометрию следовать кривой?

Можно ли сделать так, чтобы некоторые спрайты/объекты копировали себя и изгибались по кривой? Я сделал изображение, чтобы показать, что я имею в виду:

дорога

Здесь кривая, возможно, путь Безье выделена зеленым цветом, а геометрия показана черным. Я хочу, чтобы спрайт или объект (слева) копировал себя и объединял свои вершины с последней копией, а последние две вершины следовали за кривой. Если да, то как это сделать? Есть ли какая-либо документация по чему-то подобному? Вы делали что-то подобное? Как?

РЕДАКТИРОВАТЬ: я не хочу, чтобы спрайт или объект перемещались по пути, а как бы дублировали себя и сливались со своими копиями.


person Pietari    schedule 25.11.2016    source источник
comment
Возможный дубликат как заставить Sprite следовать кривой Безье   -  person ebby94    schedule 25.11.2016
comment
Это чтобы сделать трассу/дорогу?   -  person Confused    schedule 29.11.2016


Ответы (2)


Да, то, что вы хотите сделать, может работать, и ваш рисунок показывает, как это работает довольно хорошо. Псевдокод будет выглядеть примерно так:

curveLength = <length of entire curve>;
tileLength = <length of 1 tile>;
currentLength = 0;
while (currentLength < curveLength)
{
    currentTileLength = 0;
    startPt = prevPt = calculateBezierAt(0.0);
    for (t = delta; (t < 1) && (currentTileLength < tileLength); t += delta) // delta is up to you. I often use 1/100th
    {
        nextPt = calculateBezierAt(t);
        distance = distanceBetween(prevPt, nextPt);
        currentTileLength += distance;
        currentLength += distance;
        prevPt = nextPt;
    }
    endPt = prevPt;
    // Calculate quad here
}

Для расчета каждого четырехугольника необходимо построить перпендикуляры в начальной и конечной точках. Тогда у вас есть 4 очка для вашего квадроцикла.

Обратите внимание, что я упростил ситуацию, предполагая, что существует только один Безье. Обычно у вас будет много из них соединенных вместе, поэтому будет немного сложнее перебирать их, чем я сказал выше, но это не должно быть слишком сложно.

Также обратите внимание, что если у вас либо очень крутые углы, либо кривая зацикливается, вы можете получить некрасивые результаты. По-видимому, вы избежите этого, если будете генерировать кривые самостоятельно.

person user1118321    schedule 25.11.2016
comment
Можете ли вы объяснить, что означают разные переменные? Например, что такое startPt или prevPt? Что такое т? Наверное, это очевидно, но, возможно, я не могу понять, потому что английский не мой родной язык. - person Pietari; 28.12.2016
comment
Кроме того, как разместить плоскость на кривой? - person Pietari; 28.12.2016

Взгляните на SCNShape, который генерирует геометрию SceneKit из кривой Безье.

person Hal Mueller    schedule 26.11.2016