opengl 贝塞尔曲线

时间:2021-05-25 05:47:02
GLfloat ctrlpoints[4][3] = 
{
{ -4.0, -4.0, 0.0}, { -2.0, 4.0, 0.0}, 
{2.0, -4.0, 0.0}, {4.0, 4.0, 0.0}
};

GL_MAP_VERTEX_3(0.0,
               1.0,
               3,
               4,
               CTRLPOINTS[0][0]
               )
里面这个3,4是代表什么意思???
OpenGL红宝书上面说3的意思是"从一个控制点跳到下一个控制点应该推进多少个浮点值",这句话是什么意思?????
书上说4的意思4是"样条的阶数,也就是度加1,在这个例子中,度为3(因为他是三次曲线)".这个明明是二次曲线~怎么会是三次呢??
没办法给出图片~不好意思~
有红宝书的这个例子是书上334页

7 个解决方案

#1


你说的是应该是这个函数
void glMap1{fd}(GLenum target,TYPE u1,TYPE u2,GLint stride, GLint order,const TYPE *points); 
功能:定义求值器。 
参数:target:指出了控制顶点的意义以及在points参数中需要提供多少值。
         points:可以指向控制点集、RGBA颜色值或是纹理坐标串等。
         u1、u2:限定了变量U的取值范围,通常是从0变化到1。
         stride:表示跨度(在每块存储区内浮点数或双精度数的个数,即两个控制点间的偏移量)。
         order:阶数,等于次数加1,与控制点数相等。
这个问题我花了几天的时间才弄清楚!(汗!)
红宝书上是glMap1f(GL_MAP1_VERTEX_3, 0.0, 1.0, 3, 4, &ctrlpoints[0][0]);
其中3是指跨度,表示控制点中是三维坐标,即坐标元素个数;
4是阶数,阶数=次数+1=控制点数;如果要弄懂这个,需要了解贝塞尔曲线的原理,其实主要记住阶数=控制点数就容易理解了。

#2


比如
GLfloat ctrlpoints[9][3] = {{0,-0.2,0},{-1.2,-0.5,0},{-1.6,-1,0},{-1.4,-1.5,0},
{-1,-2.2,0},{-0.5,-2.7,0},{-0.35,-3.2,0},{-0.6,-3.7,0},{-1.6,-4.2,0}};//控制点

glMap1f(GL_MAP1_VERTEX_3, 0.0, 1.0, 3, 9, &ctrlpoints[0][0]);

#3


o ~谢谢你~~~
但是在337页的那个程序Bezier表面里有一个
GLfloat ctrlpoints[4][4][3] = 
{
   {{-1.5, -1.5, 4.0}, {-0.5, -1.5, 2.0}, 
    {0.5, -1.5, -1.0}, {1.5, -1.5, 2.0}}, 
   {{-1.5, -0.5, 1.0}, {-0.5, -0.5, 3.0}, 
    {0.5, -0.5, 0.0}, {1.5, -0.5, -1.0}}, 
   {{-1.5, 0.5, 4.0}, {-0.5, 0.5, 0.0}, 
    {0.5, 0.5, 3.0}, {1.5, 0.5, 4.0}}, 
   {{-1.5, 1.5, -2.0}, {-0.5, 1.5, -2.0}, 
    {0.5, 1.5, 0.0}, {1.5, 1.5, -1.0}}
};
  glMap2f(GL_MAP2_VERTEX_3, 0, 1, 3, 4,
            0, 1, 12, 4, &ctrlpoints[0][0][0]);
这里的12 和 4,其中4是不是控制V方向的控制点的个数??那12指的是什么呢?????

#4


UP

#5


vstride 
The number of floats or doubles between the beginning of control point Rij and the beginning of control point Ri(j+1), where i and j are the u and v control point indexes, respectively. This allows control points to be embedded in arbitrary data structures. The only constraint is that the values for a particular control point must occupy contiguous memory locations. 

#6


ustride\vstride相当于glMap1中的stride,uorder\vorder相当于order。
“0, 1, 12, 4,”可以对应glMap1来理解,12=4*3,即第二维元素个数*第三位元素个数。
如果还要更详细解释,需要先仔细理解P336页函数说明。

#7


哦~~但是按这样说就是V只有四个点了,因为vstride表示从一个控制点跳到下一个控制点应该推进多少个浮点值,意思就是V方向上两个控制点之间隔着多少个数据,如果是12的话那么V就只有
ctrlpoints[0][0][0]
ctrlpoints[1][0][0]
ctrlpoints[2][0][0]
ctrlpoints[3][0][0]
这四个点了,
其他都是u的点,会是这样吗???

#1


你说的是应该是这个函数
void glMap1{fd}(GLenum target,TYPE u1,TYPE u2,GLint stride, GLint order,const TYPE *points); 
功能:定义求值器。 
参数:target:指出了控制顶点的意义以及在points参数中需要提供多少值。
         points:可以指向控制点集、RGBA颜色值或是纹理坐标串等。
         u1、u2:限定了变量U的取值范围,通常是从0变化到1。
         stride:表示跨度(在每块存储区内浮点数或双精度数的个数,即两个控制点间的偏移量)。
         order:阶数,等于次数加1,与控制点数相等。
这个问题我花了几天的时间才弄清楚!(汗!)
红宝书上是glMap1f(GL_MAP1_VERTEX_3, 0.0, 1.0, 3, 4, &ctrlpoints[0][0]);
其中3是指跨度,表示控制点中是三维坐标,即坐标元素个数;
4是阶数,阶数=次数+1=控制点数;如果要弄懂这个,需要了解贝塞尔曲线的原理,其实主要记住阶数=控制点数就容易理解了。

#2


比如
GLfloat ctrlpoints[9][3] = {{0,-0.2,0},{-1.2,-0.5,0},{-1.6,-1,0},{-1.4,-1.5,0},
{-1,-2.2,0},{-0.5,-2.7,0},{-0.35,-3.2,0},{-0.6,-3.7,0},{-1.6,-4.2,0}};//控制点

glMap1f(GL_MAP1_VERTEX_3, 0.0, 1.0, 3, 9, &ctrlpoints[0][0]);

#3


o ~谢谢你~~~
但是在337页的那个程序Bezier表面里有一个
GLfloat ctrlpoints[4][4][3] = 
{
   {{-1.5, -1.5, 4.0}, {-0.5, -1.5, 2.0}, 
    {0.5, -1.5, -1.0}, {1.5, -1.5, 2.0}}, 
   {{-1.5, -0.5, 1.0}, {-0.5, -0.5, 3.0}, 
    {0.5, -0.5, 0.0}, {1.5, -0.5, -1.0}}, 
   {{-1.5, 0.5, 4.0}, {-0.5, 0.5, 0.0}, 
    {0.5, 0.5, 3.0}, {1.5, 0.5, 4.0}}, 
   {{-1.5, 1.5, -2.0}, {-0.5, 1.5, -2.0}, 
    {0.5, 1.5, 0.0}, {1.5, 1.5, -1.0}}
};
  glMap2f(GL_MAP2_VERTEX_3, 0, 1, 3, 4,
            0, 1, 12, 4, &ctrlpoints[0][0][0]);
这里的12 和 4,其中4是不是控制V方向的控制点的个数??那12指的是什么呢?????

#4


UP

#5


vstride 
The number of floats or doubles between the beginning of control point Rij and the beginning of control point Ri(j+1), where i and j are the u and v control point indexes, respectively. This allows control points to be embedded in arbitrary data structures. The only constraint is that the values for a particular control point must occupy contiguous memory locations. 

#6


ustride\vstride相当于glMap1中的stride,uorder\vorder相当于order。
“0, 1, 12, 4,”可以对应glMap1来理解,12=4*3,即第二维元素个数*第三位元素个数。
如果还要更详细解释,需要先仔细理解P336页函数说明。

#7


哦~~但是按这样说就是V只有四个点了,因为vstride表示从一个控制点跳到下一个控制点应该推进多少个浮点值,意思就是V方向上两个控制点之间隔着多少个数据,如果是12的话那么V就只有
ctrlpoints[0][0][0]
ctrlpoints[1][0][0]
ctrlpoints[2][0][0]
ctrlpoints[3][0][0]
这四个点了,
其他都是u的点,会是这样吗???