opengl--自由曲线和曲面

本文详细介绍了OpenGL中如何绘制贝塞尔曲线和曲面,包括贝塞尔曲线的参数表示法、控制点、线性和二次曲线,以及连续性和绘制2D、3D曲线的步骤。此外,还探讨了NURBS的概念,如阶、度和节点,并展示了绘制NURBS曲面的步骤,以及如何使用TRIM制造内洞。
摘要由CSDN通过智能技术生成

贝塞尔曲线和曲面

参数表示法

在这里插入图片描述

控制点

在这里插入图片描述

线性曲线

在这里插入图片描述

二次方曲线

为建构二次贝塞尔曲线,可以中介点Q0和Q1作为由0至1的t:

  • 由P0至P1的连续点Q0,描述一条线性贝塞尔曲线。
  • 由P1至P2的连续点Q1,描述一条线性贝塞尔曲线。
  • 由Q0至Q1的连续点B(t),描述一条二次贝塞尔曲线。

在这里插入图片描述
在这里插入图片描述

三次方曲线

为建构高阶曲线,便需要相应更多的中介点。对于三次曲线,可由线性贝塞尔曲线描述的中介点Q0、Q1、Q2,和由二次曲线描述的点R0、R1所建构:
在这里插入图片描述
在这里插入图片描述

连续性

在这里插入图片描述

绘制2D曲线步骤

  • 控制点
  • 画控制点(可省略)
  • 设置贝塞尔曲线,只需要调用一次
  • 使能贝塞尔曲线
  • 贝塞尔曲线绘制

控制点

//控制点 
GLint numOfPoints = 4; 
static GLfloat controlPoints[4][3] = 
{
  {-4.0f, 0.0f, 0.0f},
{-6.0f, 4.0f, 0.0f},
{6.0f, -4.0f, 0.0f},
{4.0f, 0.0f, 0.0f}};

画控制点

//画控制点
void DrawPoints()
{
  glPointSize(2.5f);
  glBegin(GL_POINTS); 
	for (int i = 0; i < numOfPoints; ++i)
    {
      glVertex3fv(controlPoints[i]);
    }
  glEnd();
} 

设置贝塞尔曲线

//设置贝塞尔曲线
glMap1f(GL_MAP1_VERTEX_3, //生成的数据类型
 	0.0f,        //u值的下界
  	100.0f,      //u值的上界
   	3,           //顶点在数据中的间隔,x,y,z所以间隔是3
    numOfPoints, //控制点的个数
    &controlPoints[0][0] //指向控制点数据的指针 
); 

使能贝塞尔曲线

glEnable(GL_MAP1_VERTEX_3);

贝塞尔曲线绘制

方法一

使用画线的方式来连接点

//使用画线的方式来连接点
glBegin(GL_LINE_STRIP);
for (int i = 0; i <= 100; i++)
{
	glEvalCoord1f((GLfloat)i);
}
glEnd();
方法二

通过glMapGrid函数来设置一个网格,来告诉OpenGL在u的值域的范围内创建一个包含各个点的空间对称的网格。然后,我们调用glEvalMesh,使用指定的图元(GL_LINE或GL_POINTS)来链接各个点。

glMapGrid1f(100, 0.0f, 100.0f);
glEvalMesh1(GL_LINE, 0, 100);

绘制3D曲线步骤

  • 控制点
  • 画控制点(可省略)
  • 设置贝塞尔曲线,只需要调用一次
  • 使能贝塞尔曲线
  • 贝塞尔曲线绘制

控制点

//控制点 
GLint nNumPoints = 3;
GLfloat ctrlPoints[3][3][3]= {
  {
  {  -4.0f, 0.0f, 4.0f},    
{ -2.0f, 4.0f, 4.0f},    
{  4.0f, 0.0f, 4.0f }},

{
  {  -4.0f, 0.0f, 0.0f},    
{ -2.0f, 4.0f, 0.0f},    
{  4.0f, 0.0f, 0.0f }},

{
  {  -4.0f, 0.0f, -4.0f},    
{ -2.0f, 4.0f, -4.0f},    
{  4.0f, 0.0f, -4.0f }}}; 

画控制点

//画控制点
void DrawPoints()
{
  	int i,j;    

	glColor3f(1.0f, 0.0f, 0.0f); 
	glPointSize(5.0f);

	glB
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值