首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >7.5.5编程实例-Bezier曲线曲面绘制

7.5.5编程实例-Bezier曲线曲面绘制

作者头像
步行者08
发布于 2018-10-09 09:13:43
发布于 2018-10-09 09:13:43
1.4K0
举报
文章被收录于专栏:图形学与OpenGL图形学与OpenGL

      (a)Bezier曲线                         (b) Bezier曲面

1. 绘制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);

//下行用于定义曲线函数

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

glEnable(GL_MAP1_VERTEX_3); //将当前曲线函数激活

}

void display(void)

{

int i;

glClear(GL_COLOR_BUFFER_BIT);

//下面用求值器按20等分计算Bezier曲线上的点

glColor3f(0.0, 0.0, 0.0);

glLineWidth(2);

glBegin(GL_LINE_STRIP);

for (i = 0; i <= 20; i++)

glEvalCoord1f((GLfloat) i/20.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(int w, int h)

{

glViewport(0, 0, (GLsizei) w, (GLsizei) 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);

else

glOrtho(-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 (argv[0]);

init ();

glutDisplayFunc(display);

glutReshapeFunc(reshape);

glutMainLoop();

return 0;

}

2. 绘制Bezier曲面

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

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); //调用求值器

glEnd();

glBegin(GL_LINE_STRIP);

for (i = 0; i <= 20; i++)

glEvalCoord2f((GLfloat)j/20.0, (GLfloat)i/20.0); //调用求值器

glEnd();

}

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]);

glEnable(GL_MAP2_VERTEX_3); //激活该曲面函数

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;

}

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2017年04月17日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
6.5编程实例-立方体透视投影
GLint winWidth = 600, winHeight = 600; //设置初始化窗口大小
步行者08
2018/10/09
9740
第6章代码-三维造型
本实例参考了著名的Nehe OpenGL示例构建了四棱锥和立方体的实体模型,这两个模型的顶点位置如图6.13所示。可见,四棱锥的四个侧面的顶点序列分别为v0v1v2、v0v2v3、v0v3v4、v0v4v1,底面为v1v2v3v4。传递顶点信息时使用了glVertex3fv函数,以顶点首地址作为参数,比glVertex3f函数直接用顶点坐标作为参数的方式更为方便、直观。在坐标系原点建好的实体可以通过几何变换放置在任意不同的位置。在本示例中,四棱锥被放置在左侧,立方体被放置在右侧。
步行者08
2020/09/21
5490
第6章代码-三维造型
实验3 OpenGL几何变换
(1)阅读实验原理,运行示范实验代码,掌握OpenGL程序平移、旋转、缩放变换的方法;
步行者08
2018/10/09
1.4K0
第5章代码-三维观察
目录 5.5 编程实例 5.5.1 二维实例——红蓝三角形 5.5.2 三维实例——立方体透视投影 5.5 编程实例 5.5.1 二维实例——红蓝三角形 #include <GL/glut.h> ty
步行者08
2020/09/19
4970
用OpenGL进行曲线、曲面的绘制
实验目的 1)理解Bezier曲线、曲面绘制的基本原理;理解OpenGL中一维、二维插值求值器的用法。 2)掌握OpenGL中曲线、曲面绘图的方法,对比不同参数下的绘图效果差异; 代码1:用四个控制点绘制一条三次Bezier曲线 #include "stdafx.h" #include <stdlib.h> #include <time.h> #include <GL/glut.h> //4个控制点的3D坐标——z坐标全为0 GLfloat ctrlpoints[4][3] = { { -4, -
Zoctopus
2018/06/04
3.3K0
【C++】OpenGL:创建线段和多边形示例
首先,将main函数中的//glutDisplayFunc(lines); //传递需要勾画的函数取消注释,这是调用线段的操作;
DevFrank
2024/07/24
2050
【C++】OpenGL:创建线段和多边形示例
3.6.2 编程实例-河南地图绘制
#include <iostream> #include <fstream> #include<vector> #include <GL/glut.h> using namespace std;
步行者08
2018/10/09
8110
python+opengl显示三维模型小程序 原
已经安装python的系统会自动安装pip,所以只需要一句pip命令就可以安装opengl了,命令如下:
晓歌
2018/08/15
4.4K0
python+opengl显示三维模型小程序
                                                                            原
实验10 Bezier曲线生成-实验提高-交互式生成B样条曲线
本代码通过交互方式来生成三次B样条曲线。主要功能: 根据鼠标左键点击产生控制点,再由控制点生成三次B样条曲线; 鼠标右键弹出菜单“New B-Spline Curve”清除当前曲线,并开始新曲线。 #include <GL/glut.h> #include <stdio.h> #include <stdlib.h> #include <vector> using namespace std; struct Point { int c[2]; int& x = c[0]; int& y = c[1]
步行者08
2022/06/12
7050
5.5 Opengl编程实例-红蓝三角形
#include <GL/glut.h> typedef GLfloat point2d[2]; // a point data type void triangle( point2d a, po
步行者08
2018/10/09
7330
[C++][opengl]利用glut和gluax画矩形等
pattern是由1和0组成的长度为16的序列,从最低位开始看,如果为1,则直线上接下来应该画的factor个点将被画为实的;如果为0,则直线上接下来应该画的factor个点将被画为虚的。 以下是一些例子:
云未归来
2025/07/20
1430
[C++][opengl]利用glut和gluax画矩形等
实验6 Bezier曲线生成
了解曲线的生成原理,掌握几种常见的曲线生成算法,利用VC+OpenGL实现Bezier曲线生成算法。
步行者08
2018/10/09
1K0
附加实验1 Sierpinski三角形
    Sierpinski三角形是一种分形图形,它是递归地构造的。最常见的构造方法如下图所示:把一个三角形分成四等份,挖掉中间那一份,然后继续对另外三个三角形进行这样的操作,并且无限地递归下去。每一次迭代后整个图形的面积都会减小到原来的3/4,因此最终得到的图形面积显然为0。这也就是说,Sierpinski三角形其实是一条曲线。
步行者08
2018/10/09
6350
OpenGL光照设置
1.设置光源 (1)光源的种类 环境光 环境光是一种无处不在的光。环境光源放出的光线被认为来自任何方向。因此,当你仅为场景指定环境光时,所有的物体无论法向量如何,都将表现为同样的明暗程度。 点光源 由这种光源放出的光线来自同一点,且方向辐射向四面八方。 平行光 平行光又称镜面光,这种光线是互相平行的。从手电筒、太阳等物体射出的光线都属于平行光。 聚光灯 这种光源的光线从一个锥体中射出,在被照射的物体上产生聚光的效果。使用这种光源需要指定光的射出方向以及锥体的顶角α。 (2)光的成分 对于每一种光源,都有漫射
Zoctopus
2018/06/04
1.2K0
实验10 Bezier曲线生成-实验提高-控制点生成B样条曲线
本代码根据已知控制点( 10, 5, 0 ),( 5, 10, 0 ),( -5, 15, 0 ),( -10, -5, 0 ),( 4, -4, 0 ),( 10, 5, 0 ), ( 5, 10, 0 ), ( -5, 15, 0 ), ( -10, -5, 0 ),( 10, 5, 0 )来生成三次B样条曲线。
步行者08
2022/06/12
6250
用OpenGL实现动态的立体时钟
(在学期末做的图形学课程设计,特将学习心得整理如下) 一、设计思路 1,设计一个平面的时钟; 按照 钟面——>中心点——>刻度——>时针——>分针——>秒针 的顺序绘制。 2,利用纹理贴图的知识使平面时钟变成立体的时钟; 3,设置键盘交互; 4,测试,修改,整理代码。 二、部分代码设计 1,键盘交互 void keyboard(unsigned char key, int x, int y) { switch (key) { case 'x': //当按下键盘上d时,以沿X轴旋
Zoctopus
2018/06/04
3.2K0
【C++】OpenGL:freeglut环境配置与基础示例
FreeGLUT(Free OpenGL Utility Toolkit)是一个开源的替代性GLUT库,它提供了类似于GLUT的功能,并在其基础上进行了扩展和改进。FreeGLUT的目标是提供一个跨平台、功能丰富且易于使用的工具库,用于OpenGL程序开发。
DevFrank
2024/07/24
6170
【图形学】探秘图形学奥秘:图形变换的解密与实战
在图形学技术的发展中,硬件加速、实时渲染、虚拟现实和增强现实等方面的创新不断推动着图形学的前沿。这门技术为数字世界的可视化和交互提供了强大的工具和方法。
SarPro
2024/02/20
2640
【图形学】探秘图形学奥秘:图形变换的解密与实战
实验11 B样条曲面生成
求值器能够描述任何角度的多项式或有理多项式样条或表面,包括B-样条,NURBS(非均匀有理B-样条)表面,Bezier曲线和表面,以及Hermite样条。由于求值器只提供了对曲线或表面底层描述,需要使用更高层次的NURBS接口来生成B样条曲面。 OpenGL提供了NURBS接口,该接口封装了大量代码,不仅包含渲染功能,也提供了修剪曲面等额外功能,NURBS函数使用平面多边形进行渲染。B样条曲面包含非均匀有理B-样条,另外Bezier的缺点是增加很多控制点时曲线变得不可控,而B样条曲面调整4个控制点可以得到较好的效果。 NURBS接口生成B样条曲面的过程如下。 (1)生成控制点和创建NURBS对象:
步行者08
2020/10/29
2K0
实验11 B样条曲面生成
OpenGL基本框架与三维对象绘制
上次我们介绍了OpenGL的环境构建和二维对象的绘制,这次我们来讲讲三维对象的绘制:  绘制代码如下: // opengltest2.cpp : Defines the entry point for the console application. // #include "stdafx.h" #include <GL/glut.h> #include <stdio.h> #include <stdlib.h> #include <math.h> #define PI 3.1415926 //金字塔初始
Zoctopus
2018/06/04
8770
相关推荐
6.5编程实例-立方体透视投影
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档