上代码:
//获取基于4个控制点的Bezier曲线上的点
Vector3 GetBezierPoint(Vector3 p0, Vector3 p1, Vector3 p2, Vector3 p3, float t)
{
t = Mathf.Clamp01(t);
float s = 1f - t;
return s * s * s * p0 + 3f * s * s * t * p1 + 3f * s * t * t * p2 + t * t * t * p3;
}
//获取基于12个控制点的曲面上的点,就是说ps是12个元素的数组
Vector3 GetSurfacePoint12(Vector3[] ps, float tu, float tv)
{
Vector3 p0 = GetBezierPoint(ps[0], ps[1], ps[2], ps[3], tu);
Vector3 p3 = GetBezierPoint(ps[9], ps[8], ps[7], ps[6], tu);
Vector3 p1 = p0 + (ps[11] - ps[0]) * (1 - tu) + (ps[4] - ps[3]) * tu;
Vector3 p2 = p3 + (ps[10] - ps[9]) * (1 - tu) + (ps[5] - ps[6]) * tu;
return GetBezierPoint(p0, p1, p2, p3, tv);
}
//获取基于16个控制点的曲面上的点,就是说ps是16个元素的数组
Vector3 GetSurfacePoint16(Vector3[] ps, float tu, float tv)
{
Vector3 p0 = GetBezierPoint(ps[0], ps[1], ps[2], ps[3], tu);
Vector3 p1 = GetBezierPoint(ps[4], ps[5], ps[6], ps[7], tu);
Vector3 p2 = GetBezierPoint(ps[8], ps[9], ps[10], ps[11], tu);
Vector3 p3 = GetBezierPoint(ps[12], ps[13], ps[14], ps[15], tu);
return GetBezierPoint(p0, p1, p2, p3, tv);
}
对于基于12个控制点的曲面,其点序号排布方式如下:
对于基于16个控制点的曲面,其点序号排布方式如下: