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

这篇Qt OpenGL教程讲解了如何构建贝塞尔曲面,重点在于理解数学原理和OpenGL实现。首先介绍贝塞尔曲面的概念,然后通过代码展示了如何在Qt环境下使用OpenGL绘制三次贝塞尔曲面,包括定义3D顶点类、贝塞尔曲面结构体,以及关键函数`initBezier`、`bernstein`和`genBezier`的实现。教程提供了源代码和资源下载,帮助读者深入理解贝塞尔曲面的绘制过程。
摘要由CSDN通过智能技术生成

第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();               
  • 8
    点赞
  • 31
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值