#include <GL/glut.h>
GLfloat ctrlpoints[4][4][3] = {
{{-3, 0, 4.0}, {-2, 0, 2.0}, {-1, 0, 0.0}, {0, 0, 2.0}},
{{-3, 1, 1.0}, {-2, 1, 3.0}, {-1, 1, 6.0}, {0, 1, -1.0}},
{{-3, 2, 4.0}, {-2, 2, 0.0}, {-1, 2, 3.0}, {0, 2, 4.0}},
{{-3, 3, 0.0}, {-2, 3, 0.0}, {-1, 3, 0.0}, {0, 3, 0.0}}
};
void display(void)
{
int i, j;
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glColor3f(0.0, 0.0, 0.0);
glPushMatrix();
glRotatef(85.0, 1.0, 1.0, 1.0);
//下面用求值器按20等分计算Bezier曲面上的点
for (j = 0; j <= 20; j++)
{
glBegin(GL_LINE_STRIP);
for (i = 0; i <= 20; i++)
glEvalCoord2f((GLfloat)i / 20.0, (GLfloat)j / 20.0); //调用求值器
/*
glEvalCoord2{fd}(TYPE u, TYPE v)
该函数将产生曲面坐标值并将其绘制
参数u和v为当前两个方向参数的离散取值
*/
glEnd();
glBegin(GL_LINE_STRIP);
for (i = 0; i <= 20; i++)
glEvalCoord2f((GLfloat)j / 20.0, (GLfloat)i / 20.0); //调用求值器
glEnd();
}
//glMapGrid2f(20,0.0, 1.0, 20, 0.0, 1.0);
//glEvalMesh2(GL_LINE, 0, 20, 0, 20);
glPopMatrix();
glFlush();
}
void init(void)
{
glClearColor(1.0, 1.0, 1.0, 0.0);
//下行的代码用控制点定义Bezier曲面函数
glMap2f(GL_MAP2_VERTEX_3, 0, 1, 3, 4, 0, 1, 12, 4, &ctrlpoints[0][0][0]);
/*
void glMap2f(GLenum target, GLfloat u1, GLfloat u2, GLint ustride, GLint uorder, GLfloat v1, GLfloat v2, GLint vstride, GLint vorder, const GLfloat * points);
二维求值器
target:求值器生成的值的类型,指出了控制顶点的意义以及在points参数中需要提供多少值。
GL_MAP2_VERTEX_3: xyz坐标
GL_MAP2_VERTEX_4:xyzw坐标
GL_MAP2_COLOR_4: RGBA
GL_MAP2_INDEX: 颜色索引
GL_MAP2_NORMAL: 法线坐标
GL_MAP2_TEXTURE_COORD_{}:纹理坐标,{1,2,3,4}
u1、u2:生成x方向上的n个数,通常是从0变化到1。
ustride:表示跨度(在每块存储区内浮点数或双精度数的个数,即两个控制点间的偏移量,对于三维的点,不管其坐标值是单精度还是双精度,stride的值都是3)。
uorder: 阶数,等于Bernstein函数的阶次加1,与控制点数相等,对3次双项式,order的值为4。
(ustride, uorder):生成x方向上,uorder个控制点,每个控制点由ustride个数表示。
v1、v2: 生成y方向上的n个数,通常是从0变化到1。
vstride:度为4的情况下,u方向上的Stride为3,因此3*4=12
(vstride, vorder): 生成y方向上,vorder个控制点,控制点之间相隔ustride*uorder个数字
points:用于传递控制点数组的起始地址,可以指向控制点集、RGBA颜色值或是纹理坐标串等。
*/
glEnable(GL_MAP2_VERTEX_3); //激活该曲面函数
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho(-5.0, 5.0, -5.0, 5.0, -5.0, 5.0); //构造平行投影矩阵
}
int main(int argc, char** argv)
{
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB | GLUT_DEPTH);
glutInitWindowSize(500, 500);
glutInitWindowPosition(100, 100);
glutCreateWindow(argv[0]);
init();
glutDisplayFunc(display);
glutMainLoop();
return 0;
}
opengl 曲面函数 Surface.cpp(学习笔记-仅供参考)
最新推荐文章于 2025-04-07 15:52:16 发布