【Qt OpenGL教程】28:贝塞尔曲面

AI权益加码!Claude Code、Cursor等20+工具免费用! 购周边限时加赠Coding Plan Lite,畅享主流AI工具!学习进阶更高效! 阅读详情

第28课:贝塞尔曲面 (参照NeHe)

这次教程中,我们将介绍贝塞尔曲面,因此这是关于数学运算的一课(这导致很不好讲),来吧,相信你能搞定它的!这一课中,我们并不是要做一个完整的贝塞尔曲面库(库的话OpenGL已经完成了),而是一个展示概念的程序,来让你熟悉曲面是怎么计算实现的。

如果想理解贝塞尔曲面没有对数学基本的认识是很难的(NeHe原文中对贝塞尔曲线和曲面的介绍并不能让一个初学者很明白,所以我并不打算照搬过来),所以如果你并不了解贝塞尔曲面,我转载了一篇文章(http://blog.csdn.net/cly116/article/details/47686349)希望能帮到你。我是希望你看完这篇文章,对贝塞尔曲线和曲面有了较系统的了解再进入这一课,不然后面涉及数学计算部分你可能会看不懂,而且文章中还介绍了OpenGL中实现的直接用于绘制贝塞尔曲线和曲面的API。当然,如果你不愿意读这篇文章或者你已经知道了关于它的数学知识你可以不看它,后面我还是多少会解释一些数学原理的。


程序运行时效果如下:



下面进入教程:


我们这次将在第01课的基础上修改代码,新增代码有不少是前面讲过的,我就不多解释了,我们重点要讲明白贝塞尔曲面是怎么绘制的。首先我们增加一个POINT_3D类,来表示一个3D顶点向量,由于比较简单,我把类声明和实现直接给大家,不多解释可以看明白的,具体代码如下:

#ifndef POINT_3D_H
#define POINT_3D_H

#include <QWidget>
#include <QGLWidget>

class POINT_3D
{
public:
    POINT_3D();
    POINT_3D(double x, double y, double z);

    double x()const;                                    //x、y、z的access函数
    double y()const;
    double z()const;

    POINT_3D operator +(const POINT_3D &p);             //向量加法
    POINT_3D operator *(double c);                      //向量数乘

private:
    double m_x, m_y ,m_z;                               //3D坐标
};

#endif // POINT_3D_H
#include "point_3d.h"

POINT_3D::POINT_3D()
{
    m_x = 0.0;
    m_y = 0.0;
    m_z = 0.0;
}

POINT_3D::POINT_3D(double x, double y, double z)
{
    m_x = x;
    m_y = y;
    m_z = z;
}

double POINT_3D::x() const
{
    return m_x;
}

double POINT_3D::y() const
{
    return m_y;
}

double POINT_3D::z() const
{
    return m_z;
}

POINT_3D POINT_3D::operator +(const POINT_3D &p)        //向量加法
{
    return POINT_3D(m_x + p.m_x, m_y + p.m_y, m_z + p.m_z);
}

POINT_3D POINT_3D::operator *(double c)                 //向量数乘
{
    return POINT_3D(m_x * c, m_y * c, m_z * c);
}

接着我们打开myglwidget.h文件,将类声明更改如下:

#ifndef MYGLWIDGET_H
#define MYGLWIDGET_H

#include "point_3d.h"
#include <QWidget>
#include <QGLWidget>

class MyGLWidget : public QGLWidget
{
    Q_OBJECT
public:
    explicit MyGLWidget(QWidget *parent = 0);
    ~MyGLWidget();

protected:
    //对3个纯虚函数的重定义
    void initializeGL();
    void resizeGL(int w, int h);
    void paintGL();

    void keyPressEvent(QKeyEvent *event);           //处理键盘按下事件

private:
    POINT_3D bernstein(float u, POINT_3D *p);       //计算贝塞尔方程的值
    GLuint genBezier(); 
计算机图形学入门17:曲面 计算机图形学入门,曲面,贝塞尔曲面,网格处理,曲面细分,曲面简化。 阅读详情

相关推荐

深入理解贝塞尔曲面算法

线性贝塞尔曲线是描述两个端点之间直线段的最简单形式。它由两个端点定义,没有控制点,因此它实际上就是这两个端点之间的直线。线性贝塞尔曲线的数学表达式通常为,其中P0和P1分别是起点和终点,参数t在 0 到 1 之间变化,控制着曲线在起点和终点之间的位置。由于线性贝塞尔曲线没有控制点,因此它不会弯曲。它通常用在需要精确地定位路径的起点和终点时,比如在绘图软件中指定一条直线。双三次贝塞尔曲面是一种广泛应用于计算机图形学中的曲面建模工具,它是由贝塞尔曲线推广而来的。

weixin_35751412的博客 730

11、计算机图形学——几何(贝塞尔曲线与曲面)

一、贝塞尔曲线 1.1、简介 下图中蓝色的线就是贝塞尔曲线,每条贝塞尔曲线都有控制点(下图中有四个),贝塞尔曲线必须经过第1个和最后一个控制点,并且需要和第起止控制点相切 1.2、如何得到贝塞尔曲线 首先找到三个控制点 然后取线段b0b1上的一个点,获取的方法依然是线性插值 然后取线段b1b2上的一个点,获取的方法也是线性插值 得到两个线性插值的点后,连接着两个点,并在这两个点组成的线段上再次进行线性插值取点 将上图中线性插值出来的所有点B02都连接起来就是一条贝塞尔

Master Cui的博客 4092

贝塞尔曲线与贝塞尔曲面

本文介绍了贝塞尔曲线与曲面的基本原理。贝塞尔曲线通过控制点和参数t的线性插值递归生成,n个控制点形成n-1次曲线,具有经过端点、与端点相切、仿射变换和凸包等性质。高阶贝塞尔曲线存在局部控制困难的问题,常用分段三次曲线拼接解决。贝塞尔曲面则扩展至三维,通过在u、v两个参数方向上分别进行插值计算生成。文章还简要提及B样条曲线和NURBS曲线的特点,它们能更好地实现局部控制和描述圆锥曲线。贝塞尔曲线广泛应用于图形设计、字体等领域。

人无远虑,必有近忧 4553

贝塞尔曲线曲面原理及推导过程

③逼近:先给定由若干个型值点勾画的一条折线轮廓,然后要求用曲线、曲面逼近这个折线轮廓,折一折线轮廓构成的多边形称为控制多边形。①插值:用光滑的曲线或曲面把给定的若干个离散点连接起来,即由型值点构造的曲线或曲面通过所有的型值点;显式或隐式方法可以非常直观的表示初等解析曲线曲面,曲线曲面的特性也可以通过表示形式清楚的表现出来。⑥规格化的参数变量t∈[0,1],使其相应的几何分量是有界的,而不必用另外的参数去定义边界;由上图可知,当组合的曲线达到2阶连续性的时候,曲线之间就已经有了非常好的光滑连接。

2301_78882629的博客 2007

计算机图形学十:几何2—贝塞尔曲线(Bézier Curves)与贝塞尔曲面(Bézier Surfaces)

贝塞尔曲线与贝塞尔曲面1 贝塞尔曲线(Bézier Curves)2 贝塞尔曲面(Bézier Surfaces)Reference 1 贝塞尔曲线(Bézier Curves) 在进入具体原理讲解之前,首先看一下一条实际的贝塞尔曲线长什么样子 其中 p0,p1,p2,p3p_0,p_1,p_2,p_3p0​,p1​,p2​,p3​为控制点,蓝色所表示曲线正是非常著名的贝塞尔曲线了,可以从图中观察到,曲线会与初始与终止端点相切,并且经过起点p0p_0p0​与终点p3p_3p3​。那么这样一条曲线究竟是怎么

吃人的博客 9460

To be a senior software engineer【4】(QT+openGL

4.从milkshape3D导入场景   前两天突然就生病了。打完针输完液庆幸只是国产的感冒。看来要加强运动啦。这一节我们将会在上一节的基础上,研究构建我们三维场景的更高效途径。首先,让我们回归一下之前我们都完成了哪些:1.建立了一个三维场景2.用自定义文件及数据格式的方式构建了我们需要的简单对象(立方体,贝塞尔曲面)3.在以上的建模及编程中,我们用到了诸如显示列表的一些东西   这一节中

chuckGao的专栏 2093

QT+openGL

转自:http://chuckgao.blogbus.com/tag/openGL/ Chapter 1 openGL       我决定第一章从最近的工作写起。openGL是什么?我不太能回答这个问题,不过我知道我打算用它来做些什么。我想要做一个简单的导航系统,而我打算用openGL绘制我的三维导航。其实,这对于我来说事件十分复杂的工作,而且我给自己定下的目标仅仅是能够简单的实现几个场景切换

hbyzl的专栏 2424

To be a senior software engineer【3】(QT+openGL

3.看起来不那么像的汽车  让我们回顾下上一节,我们构建了一个单薄的小人,可它看起来并不让我们满意。这一节中,我们将介绍:①构建一个三维场景,且里面的物体也是立体的,我们的小人也是立体的。如果我们构造的物体看起来都差不多,我们会考虑使用displayList显示列表②构建其他的三维场景,并且我们可以在需要的时候切换这些场景。这里,我们学会构建一些类,用它来储存 我们的场景信息③从文件读入我

chuckGao的专栏 1578

OpenGL(可编程管线):Shader + Bezier曲面 +QT

Bezier曲面前面的博客已经介绍,本次绘制Bezier曲面使用了细分着色器 直接上代码 #pragma once #include <vector> #include <qopenglfunctions_4_4_core.h> #include <iostream> #include <qmatrix4x4.h> #include "Shader.h" #include <string> using namespace std; class B

ht_vIC的博客 655

To be a senior software engineer【2】(QT+openGL

2.单薄的小人   上一节中我们展示了如何创建一个看似立体的场景,当然,我们只是靠一些纹理贴图让它看起来立体,而不是真正的去构建三维模型。在这一节中,我们要在前面的场景中加入一些元素。我们把这些加入的元素想象成人、汽车或者是其他的一些东西。而我们的目标是让它们看起来是在场景中移动。   还记得上一节中我们只绘制了5个面吗,现在,我们把第六个面加进来,但是并不将它作为我们立方体的正面。你可以把第六个

chuckGao的专栏 1701

NeHe OpenGL系列教程(中英文版附带VC++源码)中英文系列

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_34283445的博客 199

3次Bezier曲线,曲面和3次B样条曲线和曲面

问题:       昨天刚忙完图形学的编程作业,题目是自拟,听老师说他要重点考这个自由曲线,曲面,特地把作业定位了这个,好熟悉熟悉,据说成程老师的课考试非常的难呀。郁闷。 解答:      先自由曲线的含义和概念。基本上我的理解就是根据控制的形值点,来生成一些类的点,然后用直线来连接这些点,连接后形成的曲线会逼近你用的型值点所画的多边形。三次Bezier曲线需要四个形值点,这里我在

xiaoGang的专栏 1万+

openGL贝塞尔曲面细分

openGL系列文章目录 文章目录openGL系列文章目录前言一、贝塞尔曲面细分原理二、代码1.主程序c++效果 前言 现在让我们扩展我们的程序,使它将我们简单的矩形网格转换为贝塞尔曲面。细分网格 应该为我们提供了足够的顶点来对曲面进行采样(如果我们想要更多的话,我们可以增加 内部/外部细分级别)。我们现在需要的是通过管线发送控制点,然后使用这些控制点执行计 算以将细分网格转换为我们所需的贝塞尔曲面。 假设我们希望建立一个立方体贝塞尔曲面,我们将需要16 个控制点。我们可以通过VBO 从C++端发送它们,或

aoxuestudy的专栏 2546

计算机图形学----贝塞尔曲线与曲面相关知识汇总

本文整理自西安交通大学软件学院祝继华老师的计算机图形学课件,请勿转载 文章目录贝塞尔曲线与曲面定义Betnstein基函数的性质Bezier曲线的性质Bezier曲线的递推算法Bezier曲线的升阶新控制顶点的计算Bezier曲面定义性质递推算法 贝塞尔曲线与曲面 定义 给定空间n+1个点的位置矢量Pi(i=0,1,2,…,n)P_i(i=0,1,2,…,n)Pi​(i=0,1,2,…,n),则Bezier参数曲线上各点坐标的插值公式是: PiP_iPi​构成该Bezier曲线的特征多边形 Bi,n(.

Qlz的博客 2661

计算机图形学【GAMES-101】5、几何(距离函数SDF、点云、贝塞尔曲线、曲面细分、曲面简化)

Lecture10~121 几何图形的表示方式1.1 几何的隐式表示法1.1.1 函数1.1.2 Constructive Solid Geometry(CSG)1.1.3 距离函数1.1.4 水平集(Level Set)1.2 几何的显式表示法1.2.1 点云(Point Cloud)1.2.2 多边形模型1.2.3 贝塞尔曲线1.2.4 Splines样条线1.2.5 贝塞尔曲面2 几何的操作方式2.1 曲面细分2.1.1Loop细分(Loop Subdivision)2.1.2 Catmull-Cla

记录值得记录的东西 5675

计算机图形学十贝塞尔曲线

计算及图形学 贝塞尔曲线

weixin_44683202的博客 3572

OpenGL绘制Bezier曲面

贝塞尔曲面是贝塞尔曲线在二维上的扩展。它由一组控制点定义,通过这些控制点生成光滑的曲面。贝塞尔曲面通常用两个参数u和v来表示,这两个参数的取值范围都在 [0, 1] 之间。

ht_vIC的博客 1635

计算机图形学:三次Bezier曲面的绘制(算法原理及代码实现)

一、算法原理 如果说对于曲线来说只有一个参数,0=<t<=1,那么对于一个面来说,就应该有两个参数,分别设0=<ɑ<=1, 0=<β<=1。 首先规定一共4x4 = 16个控制点,其水平面位置如图中16个黑点所示(并未表示出高度,防止图形太乱),将这16个点分成4列,图中红色圈中的为一列的具体例子。 第1步 在这4个控制点之下利用第一个参数ɑ运用第一章的计算贝塞尔曲线的方法得到蓝色点,因为有4列,所以一共可以得到如图所示的4个蓝色点。...

qq_55982881的博客 5357

c++ 画贝塞尔曲线代码

代码】c++画贝塞尔曲线代码。直接代码示例,不用下载

HETONGDE的博客 1803
上一篇: 【Qt OpenGL教程】27:阴影
下一篇: 【转】贝塞尔曲线和曲面
cly116
博客等级 码龄11年 290粉丝 33原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值