opengl 曲面函数 Surface.cpp(学习笔记-仅供参考)

#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;
}

在这里插入图片描述

  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值