OpenGL实现B样条曲线
文章目录
- 一、vs2019安装OpenGL
- 二、PPT
- 三、代码
- 四、运行结果
- 总结
- 附bezier曲线代码
一、vs2019安装OpenGL
https://blog.csdn.net/SouthWooden/article/details/108570410
二、PPT
https://www.cs.utexas.edu/~bajaj/graphics2012/cs354/lectures/lect11.pdf
三、代码
#include <GL/glut.h>GLUnurbsObj* theNurb;
GLfloat ctrlpoints[11][3] =
{ { 1.0, 2.0, 0.0}, { 1.6, 0.9, 0.0},{2.4, 2.1, 0.0}, {3.6, 1.3, 0.0},{4.5, 0.6, 0.0},
{5.3, -0.3, 0.0},{5.9, -1.4, 0.0},{6.9, -0.5, 0.0},{7.7, 0.6, 0.0},{8.5, 1.5, 0.0},
{9.3, 3.7, 0.0} };/*GLfloat color[9][3] = { {1.0,0.0,0.0},{1.0,1.0,0.0},{0.0,1.0,0.0},{-1.0,1.0,0.0},
{-1.0,0.0,0.0},{-1.0,-1.0,0.0},{0.0,-1.0,0.0},{1.0,-1.0,0.0},{1.0,-1.0,0.0} };*/GLfloat knots[15] = { 0.0, 0.0, 0.0, 0.0,0.2, 0.4, 0.4, 0.6,0.8, 0.8, 0.8,1.0, 1.0, 1.0, 1.0 }; void init(void)
{glClearColor(1.0, 1.0, 1.0, 0.0);//设置背景色theNurb = gluNewNurbsRenderer();//创建NURBS对象theNurbgluNurbsProperty(theNurb, GLU_SAMPLING_TOLERANCE, 10);
}
/*绘制曲线*/
void Display(void)
{int i;glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);glColor3f(0.0, 0.0, 0.0);glLineWidth(3.0);/*绘制曲线*/gluBeginCurve(theNurb);gluNurbsCurve(theNurb, 13, knots, 3, &ctrlpoints[0][0], 4, GL_MAP1_VERTEX_3);//gluNurbsCurve(theNurb, 13, knots, 3, &color[0][0], 4, GL_MAP1_COLOR_4);gluEndCurve(theNurb);/*绘制控制多边形*/glLineWidth(1);//设置栅格化线条的宽度glColor3f(0.0, 0.0, 1.0);glBegin(GL_LINE_STRIP);for (i = 0; i < 11; i++)glVertex3fv(&ctrlpoints[i][0]);glEnd();/*绘制点*/glColor3f(1.0, 0.0, 0.0);glPointSize(5.0);glBegin(GL_POINTS);for (i = 0; i < 11; i++)glVertex2fv(&ctrlpoints[i][0]);glEnd();glutSwapBuffers();
}
void Reshape(GLsizei w, GLsizei h)
{glViewport(0, 0, w, h);glMatrixMode(GL_PROJECTION);glLoadIdentity();if (w <= h)glOrtho(-1.0, 10.0, -5.0 * (GLfloat)h / (GLfloat)w, 5.0 * (GLfloat)h /(GLfloat)w, -5.0, 5.0);elseglOrtho(-1.0 * (GLfloat)w / (GLfloat)h, 10.0 * (GLfloat)w / (GLfloat)h, -5.0, 5.0, -5.0, 5.0);glMatrixMode(GL_MODELVIEW);glLoadIdentity();
}void keyboard(unsigned char key, int x, int y) //key 为键盘按键的ASCII码
{switch (key){case 'x':case 'X':case 27: //ESC键exit(0);break;default:break;}
}int main(int argc, char** argv)
{glutInit(&argc, argv);glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH);glutInitWindowSize(600, 400);glutInitWindowPosition(200, 200);glutCreateWindow("三次B样条曲线");/*绘制与显示*/init();glutReshapeFunc(Reshape);glutKeyboardFunc(keyboard);glutDisplayFunc(Display);glutMainLoop();return(0);
}
四、运行结果
总结
- OpenGL绘图框架
- Nurbs类使用
- 求值器理解
- 绘制点、直线、曲线
- reshape函数设置
附bezier曲线代码
#include <GL/glut.h>
GLfloat ctrlpoints[4][3] =
{ { -4.0, -4.0, 0.0}, { -2.0, 3.0, 0.0},{2.0, 4.5, 0.0}, {3.0, -3.0, 0.0} };
void init(void)
{glClearColor(1.0, 1.0, 1.0, 0.0);glShadeModel(GL_FLAT);//下行用于定义曲线函数glEnable(GL_MAP1_VERTEX_3); //将当前曲线函数激活glMap1f(GL_MAP1_VERTEX_3, 0.0, 1.0, 3, 4, &ctrlpoints[0][0]);
}//void glMap1f (GLenum target, GLfloat u1, GLfloat u2, GLint stride, GLint order, const GLfloat *points);//将控制点坐标映射为曲线坐标//参数1:GL_MAP1_VERTEX_3,3维点坐标//参数2和3:控制参数t或u的取值范围[0, 1]//参数4:曲线内插值点间的步长3————3维坐标//参数5:曲线间的补偿为顶点数4个————总步长为12//参数6:控制点二维数组首元素地址void display(void)
{int i;glClear(GL_COLOR_BUFFER_BIT);//下面用求值器按10等分计算Bezier曲线上的点glColor3f(0.0, 0.0, 0.0);glLineWidth(5);//设置栅格化线条的宽度//glBegin来指明如何使用这些顶点glBegin(GL_LINE_STRIP);for (i = 0; i <= 30; i++)//10控制曲线的光滑程度,也就是打点的密集程度glEvalCoord1f((GLfloat)i / 30.0); //相当于调用了glVertex*()glEnd();//下面绘制控制多边形glLineWidth(1);//设置栅格化线条的宽度glColor3f(0.0, 0.0, 1.0);glBegin(GL_LINE_STRIP);for (i = 0; i < 4; i++)glVertex3fv(&ctrlpoints[i][0]);glEnd();glFlush();
}
void reshape(GLsizei w, GLsizei h)
{glViewport(0, 0, w, h);glMatrixMode(GL_PROJECTION);glLoadIdentity();if (w <= h)glOrtho(-5.0, 5.0, -5.0 * (GLfloat)h / (GLfloat)w, 5.0 * (GLfloat)h / (GLfloat)w, -5.0, 5.0);elseglOrtho(-5.0 * (GLfloat)w / (GLfloat)h, 5.0 * (GLfloat)w / (GLfloat)h, -5.0, 5.0, -5.0, 5.0);glMatrixMode(GL_MODELVIEW);glLoadIdentity();
}
int main(int argc, char** argv)
{glutInit(&argc, argv);glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);//显示模式glutInitWindowSize(500, 500);glutInitWindowPosition(100, 100);glutCreateWindow("三次bezier曲线");init();glutDisplayFunc(display);glutReshapeFunc(reshape);glutMainLoop();return 0;
}
感谢许多人分享自己的代码,站在巨人肩膀上,我才能看得更远
OpenGL实现B样条曲线相关推荐
- 样条表示---OpenGL的逼近样条函数
2019独角兽企业重金招聘Python工程师标准>>> OpenGL的Bezier样条曲线函数 OpenGL的Bezier样条曲面函数 GLUT的B样条曲线函数 GLUT的B样条曲面 ...
- Python+OpenGL绘制任意长度和次数的B样条曲线
开学第一课:一定不要这样问老师Python问题 中国大学MOOC"Python程序设计基础"第6次开课时间 董付国老师Python系列教材推荐与选用参考 ============= ...
- 计算机图形软件---OpenGL简介
2019独角兽企业重金招聘Python工程师标准>>> 基本的OpenGL语法 OpenGL基本函数库用来描述图元.属性.几何变换.观察变换和进行许多其他的操作. OpenGL基本库 ...
- 3次Bezier曲线,曲面和3次B样条曲线和曲面
问题: 昨天刚忙完图形学的编程作业,题目是自拟,听老师说他要重点考这个自由曲线,曲面,特地把作业定位了这个,好熟悉熟悉,据说成程老师的课考试非常的难呀.郁闷. 解答: 先自由曲线的含义和概念.基本上我 ...
- [OpenGL] 雪景火焰特效demo
很久之前的代码了,项目用的是vs2013,编译器套件可以在项目属性中修改. 代码地址:点击打开链接 模型导入 此处使用了开源代码. 自己使用Maya对场景中一些物体建模,然后三角形化后保存为obj格式 ...
- OpenCL,OpenGL编译
OpenCL,OpenGL编译 TVM已经支持多个硬件后端:CPU,GPU,移动设备等-添加了另一个后端:OpenGL / WebGL. OpenGL / WebGL能够在没有安装CUDA的环境中利用 ...
- OpenGL在图形管道中调用了什么用户模式图形驱动程序(UMD)?
OpenGL在图形管道中调用了什么用户模式图形驱动程序(UMD)? 图形硬件供应商,需要为显示适配器编,编写用户模式显示驱动程序.用户模式显示驱动程序,是由Microsoft Direct3D运行时加 ...
- Android OpenGL ES(十一)绘制一个20面体 .
前面介绍了OpenGL ES所有能够绘制的基本图形,点,线段和三角形.其它所有复杂的2D或3D图形都是由这些基本图形构成. 本例介绍如何使用三角形构造一个正20面体.一个正20面体,有12个顶点,20 ...
- c++之openGL在VS中的配置及简单图形绘制
VS中openGL的配置 相关资源下载: 链接:https://pan.baidu.com/s/1hRlxbckgLsNiS87k5CPvLg 提取码:tz87 以vs2010为例: 将下载的压缩包解 ...
- 利用OpenGL渲染并用OpenCV输出显示二维图像
OpenGL所有渲染的结果都输出显示在窗口中,设置OpenCV的图像cv::Mat outimg,并使用OpenGL的glReadPixels从帧缓冲区中加载像素至内存: //use fast 4-b ...
最新文章
- 任务管理 linux指令qsub,Linux_前一个投的任务跑完再跑另一个任务_qsub_-hold_jid
- java jar包图片_jar包的图片不显示 求解
- 中日文字编码转换_关于编码你必须知道的知识和技巧
- 穷人想变富,富人想变得更富
- 项目调研的误区和关键点
- 【笔试/面试】SQL 经典面试题
- Harbor 2.1发布,工程师的发际线有救了!
- POJ 3764 DFS+trie树
- 老外的一份渗透测试报告
- 2011年度全球移民国家移民条件浅析
- Android Camera 预览及录制视频 附demo
- 达内学软件测试发证书吗,达内软件测试培训让我拥有了实际工作经验
- Android 限制启动应用最大使用内存,可供极限测试时使用
- 关于jquery.mloading加载loading效果
- lua 自实现pairs
- echarts柱状图柱体使用图片
- 2022腾讯云年终11.11活动优惠提前享: 一键领取元1888元早鸟券
- Nginx Image 缩略图 模块
- ws550 第三方固件_华为WS550路由器如何升级固件
- 从头学习爬虫(三十八)进阶篇----教务网课程表下载