{
{ -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=控制点数;如果要弄懂这个,需要了解贝塞尔曲线的原理,其实主要记住阶数=控制点数就容易理解了。
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]);
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指的是什么呢?????
但是在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.
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页函数说明。
“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的点,会是这样吗???
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=控制点数;如果要弄懂这个,需要了解贝塞尔曲线的原理,其实主要记住阶数=控制点数就容易理解了。
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]);
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指的是什么呢?????
但是在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.
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页函数说明。
“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的点,会是这样吗???
ctrlpoints[0][0][0]
ctrlpoints[1][0][0]
ctrlpoints[2][0][0]
ctrlpoints[3][0][0]
这四个点了,
其他都是u的点,会是这样吗???