Was sind die häufigsten Splines, die Sie in der Spieleentwicklung finden?


11

Listen Sie hier die häufigsten Splines in der Spieleentwicklung auf, wie viele Punkte die Methode zum Interpolieren einer Kurve benötigt und wie Sie einen Datentyp erstellen können, mit dem Sie eine Interpolation der Kurvenpunkte erhalten. Beispiele: Bezierkurven, B-Splines, Cubic Splines usw.

PS: Ich stelle dies als Community-Wiki ein, damit wir alle Arten der Spline-Interpolation auflisten können.


1
Das ist eine gute Frage, IMO.
Jacmoe

2
Ich stimme dafür, dass diese Frage geändert wird, um sie auf die Interpolation und nicht speziell auf die Spline-Interpolation anzuwenden. Darum ging es meiner Meinung nach bei der Frage, daher meine falsche Antwort unten.
Ricket

Obwohl Ihre bilineare Interpolation eine gute Antwort ist, denke ich, dass diese Art von Berechnungen in eine verwandte Frage einfließen könnte, zum Beispiel eine Spline-Anpassung oder Näherungen. Oder vielleicht irre ich mich und diese könnten auch hier hingehen.
Chiguire

Antworten:


4

Der einfachste Fall ist eine lineare Interpolation für eine gerade Linie:

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

Angenommen, t liegt zwischen [0, 1]:

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

3

Catmull-Rom-Splines (eine Art kubischer Hermite-Spline) können sehr nützlich sein, wenn Sie eine Reihe von Punkten haben, zwischen denen Sie einen glatten Pfad erstellen möchten (ohne zusätzliche Kontrollpunkte zu definieren), z. B. Kamerapfade

Für alle Mathematik siehe:

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

Wenn Sie D3DX verwenden, gibt es einige praktische Funktionen, um damit umzugehen (D3DXVec3CatmullRom).


0

Bearbeiten: Entschuldigung, wie Jason im Kommentar betont, handelt die folgende Antwort nicht von Splines, sondern von zweidimensionaler linearer (oder bilinearer ) Interpolation. Ich entscheide mich, es nicht zu löschen, falls jemand es informativ findet.


Ich habe ein einfaches 3D-Terrain erstellt und wollte dann, dass mein Charakter über das Terrain läuft. Um die Höhe des Charakters an einem beliebigen Punkt im Gelände zu ermitteln, habe ich die bilineare Interpolation verwendet .

Hier ist der Java-Code, den ich für die bilineare Interpolation verwende:

/**
 * 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},
            };
    }
}

Beachten Sie, dass die bikubische Interpolation eine gleichmäßigere oder realistischere Interpolation über entfernte Punkte hinweg ermöglichen kann. Aber ich entscheide mich für bilinear, weil ich ein dichtes Gitter habe, um zu optimieren (vielleicht vorzeitig).


Die Frage ist über Interpolation entlang eines Splines
Jason Kozak

Es tut uns leid; Nachricht oben in der Antwort hinzugefügt.
Ricket
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.