Какие наиболее распространенные сплайны вы найдете в разработке игр?


11

Перечислите здесь наиболее распространенные сплайны, найденные при разработке игры, сколько точек нужно методу для интерполяции кривой, и как вы можете построить тип данных, который позволит вам получить интерполяцию точек кривой. Примеры: кривые Безье, B-сплайны, кубические сплайны и т. Д.

PS: я представляю это как вики сообщества, чтобы мы могли перечислить все виды сплайн-интерполяции.


1
Это хороший вопрос, ИМО.
Жакмо

2
Я голосую за изменение этого вопроса, чтобы он применялся к интерполяции, а не к сплайн-интерполяции. Это то, о чем я думал, вопрос был, таким образом, мой неуместный ответ ниже.
Рикет

Несмотря на то, что ваша билинейная интерполяция является хорошим ответом, я думаю, что такого рода вычисления могут идти в связанном вопросе, например, подгонка сплайна или приближения. Или, может быть, я ошибаюсь, и они также могут пойти сюда.
chiguire

Ответы:


4

Самый простой случай - это линейная интерполяция для прямой линии:

(x0, y0) * ------------------------ * (x1, y1)

Скажите t между [0, 1]:

function lerp((x0, y0), (x1, y1), t):
    return (x0+(x1-x0)*t, y0+(y1-y0)*t)

3

Сплайны Catmull-Rom (тип кубического сплайна Эрмита) могут быть очень полезны, если у вас есть набор точек, которые вы хотите создать плавный путь между (без определения каких-либо дополнительных контрольных точек), такие как пути камеры

По всем математикам смотрите:

http://en.wikipedia.org/wiki/Cubic_Hermite_spline

Если вы используете D3DX, есть несколько удобных функций для работы с ними (D3DXVec3CatmullRom)


0

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


Я создал простой 3D рельеф местности , а затем хотел , чтобы мой характер ходить по местности. Таким образом, чтобы найти высоту персонажа в любой точке на местности, я использовал билинейной интерполяции .

Вот код Java, который я использую для билинейной интерполяции:

/**
 * Interpolates the value of a point in a two dimensional surface using bilinear spline interpolation.
 * The value is calculated using the position of the point and the values of the 4 surrounding points.
 * Note that the returned value can be more or less than any of the values of the surrounding points. 
 * 
 * @param p A 2x2 array containing the heights of the 4 surrounding points
 * @param x The horizontal position, between 0 and 1
 * @param y The vertical position, between 0 and 1
 * @return the interpolated height
 */
private static float bilinearInterpolate (float[][] p, float x, float y) {
    return p[0][0]*(1.0f-x)*(1.0f-y) + p[1][0]*x*(1.0f-y) + p[0][1]*(1.0f-x)*y + p[1][1]*x*y;
}

/**
 * Finds a 2-dimensional array of the heights of the four points that 
 * surround (x,y).
 *
 * Uses the member variable "verts", an 2D array of Vertex objects which have
 * a member "height" that is the specific vertex's height.
 */
private float[][] nearestFour(float x, float y) {
    int xf = (int) Math.floor(x);
    int yf = (int) Math.floor(y);

    if(xf < 0 || yf < 0 || xf > verts[0].length-2 || yf > verts.length-2) {
        // TODO do something better than just return 0s
        return new float[][]{
                {0.0f, 0.0f},
                {0.0f, 0.0f}
            };
    } else {
        return new float[][]{
                {verts[yf][xf].height, verts[yf][xf+1].height},
                {verts[yf+1][xf].height, verts[yf+1][xf+1].height},
            };
    }
}

Обратите внимание, что бикубическая интерполяция может представлять более плавную или более реалистичную интерполяцию в удаленных точках; но я выбираю билинейную, потому что у меня плотная сетка, в попытке оптимизировать (возможно, преждевременно).


Вопрос об интерполяции вдоль сплайна
Джейсон Козак

Сожалею; сообщение добавлено в начало ответа.
Рикет
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.