贝塞尔曲线和曲面
参数表示法
控制点
线性曲线
二次方曲线
为建构二次贝塞尔曲线,可以中介点Q0和Q1作为由0至1的t:
- 由P0至P1的连续点Q0,描述一条线性贝塞尔曲线。
- 由P1至P2的连续点Q1,描述一条线性贝塞尔曲线。
- 由Q0至Q1的连续点B(t),描述一条二次贝塞尔曲线。
三次方曲线
为建构高阶曲线,便需要相应更多的中介点。对于三次曲线,可由线性贝塞尔曲线描述的中介点Q0、Q1、Q2,和由二次曲线描述的点R0、R1所建构:
连续性
绘制2D曲线步骤
- 控制点
- 画控制点(可省略)
- 设置贝塞尔曲线,只需要调用一次
- 使能贝塞尔曲线
- 贝塞尔曲线绘制
控制点
//控制点
GLint numOfPoints = 4;
static GLfloat controlPoints[4][3] =
{
{-4.0f, 0.0f, 0.0f},
{-6.0f, 4.0f, 0.0f},
{6.0f, -4.0f, 0.0f},
{4.0f, 0.0f, 0.0f}};
画控制点
//画控制点
void DrawPoints()
{
glPointSize(2.5f);
glBegin(GL_POINTS);
for (int i = 0; i < numOfPoints; ++i)
{
glVertex3fv(controlPoints[i]);
}
glEnd();
}
设置贝塞尔曲线
//设置贝塞尔曲线
glMap1f(GL_MAP1_VERTEX_3, //生成的数据类型
0.0f, //u值的下界
100.0f, //u值的上界
3, //顶点在数据中的间隔,x,y,z所以间隔是3
numOfPoints, //控制点的个数
&controlPoints[0][0] //指向控制点数据的指针
);
使能贝塞尔曲线
glEnable(GL_MAP1_VERTEX_3);
贝塞尔曲线绘制
方法一
使用画线的方式来连接点
//使用画线的方式来连接点
glBegin(GL_LINE_STRIP);
for (int i = 0; i <= 100; i++)
{
glEvalCoord1f((GLfloat)i);
}
glEnd();
方法二
通过glMapGrid函数来设置一个网格,来告诉OpenGL在u的值域的范围内创建一个包含各个点的空间对称的网格。然后,我们调用glEvalMesh,使用指定的图元(GL_LINE或GL_POINTS)来链接各个点。
glMapGrid1f(100, 0.0f, 100.0f);
glEvalMesh1(GL_LINE, 0, 100);
绘制3D曲线步骤
- 控制点
- 画控制点(可省略)
- 设置贝塞尔曲线,只需要调用一次
- 使能贝塞尔曲线
- 贝塞尔曲线绘制
控制点
//控制点
GLint nNumPoints = 3;
GLfloat ctrlPoints[3][3][3]= {
{
{ -4.0f, 0.0f, 4.0f},
{ -2.0f, 4.0f, 4.0f},
{ 4.0f, 0.0f, 4.0f }},
{
{ -4.0f, 0.0f, 0.0f},
{ -2.0f, 4.0f, 0.0f},
{ 4.0f, 0.0f, 0.0f }},
{
{ -4.0f, 0.0f, -4.0f},
{ -2.0f, 4.0f, -4.0f},
{ 4.0f, 0.0f, -4.0f }}};
画控制点
//画控制点
void DrawPoints()
{
int i,j;
glColor3f(1.0f, 0.0f, 0.0f);
glPointSize(5.0f);
glB