游戏开发中最常见的样条是什么?

这里列出游戏开发中最常见的样条曲线,该方法需要插入曲线的点数,以及如何构建数据types,以便获得曲线点的插值。 示例:贝塞尔曲线,B样条曲线,三次样条曲线等

PS:我把这个作为一个社区wiki,所以我们可以列出各种样条插值。

最简单的情况是直线的线性插值:

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

说t在[0,1]之间:

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

Catmull-Rom样条曲线(一种立方Hermite样条曲线)可以是相当有用的,如果你有一组点,你想创建一个平滑的path之间(没有定义任何额外的控制点),如相机path

对于所有的math,请看:

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

如果你使用D3DX,有一些方便的function来处理它们(D3DXVec3CatmullRom)

编辑:对不起,正如杰森在评论中指出的,下面的答案不是关于样条,而是关于二维线性(或双线性 )插值。 我select不删除它,以防有人可能发现它的信息。


我创建了一个简单的3D地形,然后让我的角色穿越地形。 因此,为了在地形的任何一点find角色的高度,我使用了双线性插值 。

这里是我用于双线性插值的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.0fx)*(1.0fy) + p[1][0]*x*(1.0fy) + p[0][1]*(1.0fx)*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}, }; } } 

请注意,双三次插值可能会呈现更平滑或更加真实的跨越远点的插值; 但我select双线性因为我有一个密集的网格,试图优化(也许提前)。