您当前的位置: 首页 > 

phymat.nico

暂无认证

  • 3浏览

    0关注

    1967博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

用OpenGL进行曲线、曲面的绘制

phymat.nico 发布时间:2020-01-16 13:59:51 ,浏览量:3

实验目的
  • 理解Bezier曲线、曲面绘制的基本原理;理解OpenGL中一维、二维插值求值器的用法。
  • 掌握OpenGL中曲线、曲面绘图的方法,对比不同参数下的绘图效果差异;

 

代码1:用四个控制点绘制一条三次Bezier曲线

Github地址

#include "stdafx.h"
#include 
#include 
#include 

//4个控制点的3D坐标——z坐标全为0
GLfloat ctrlpoints[4][3] = {
    { -4, -4, 0 }, { -2, 4, 0 }, { 2, -4, 0 }, { 4, 4, 0 }
};

void init(void)
{
    //背景色
    glClearColor(0.0, 0.0, 0.0, 1.0);
    //将控制点坐标映射为曲线坐标
    //参数1:GL_MAP1_VERTEX_3,3维点坐标
    //参数2和3:控制参数t或u的取值范围[0, 1]
    //参数4:曲线内插值点间的步长3————3维坐标
    //参数5:曲线间的补偿为顶点数4个————总步长为12
    //参数6:控制点二维数组首元素地址
    //注意: 若是在这里设置了相关参数,后续对ctrlpoints内容更改曲线不变
    glMap1f(GL_MAP1_VERTEX_3, 0.0, 1.0, 3, 4, &ctrlpoints[0][0]);
    //打开开关——允许3维坐标控制点到参数点转换开关
    glEnable(GL_MAP1_VERTEX_3);
    glShadeModel(GL_FLAT);

    //代码开关2:去掉本注释,可启用反走样
    /*
    glEnable(GL_BLEND);
    glEnable(GL_LINE_SMOOTH);  //允许直线反走样
    glHint(GL_LINE_SMOOTH_HINT, GL_FASTEST);  // Antialias the lines
    glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
    */
}

void display(void)
{
    int i;
    glClear(GL_COLOR_BUFFER_BIT);
    glColor3f(1.0, 1.0, 1.0);

    //代码开关1:去掉本注释,查看动态的曲线绘图效果:动态更新控制点坐标
    /*
    for(int t = 0; t < 4; t++) {
    for(int j = 0; j < 3; j++)
    ctrlpoints[t][j] = (rand() % 1024 / 1024.0 - 0.5) * 10;
    }
    //动态映射
    glMap1f(GL_MAP1_VERTEX_3, 0.0, 1.0, 3, 4, &ctrlpoints[0][0]);
    */
    glLoadIdentity();
    glColor3f(1.0, 0.0, 0.0);
    //绘制连续线段
    glBegin(GL_LINE_STRIP);
    //参数t或u取值为i/30,共计31个点
    for (i = 0; i             
关注
打赏
1659628745
查看更多评论
立即登录/注册

微信扫码登录

0.0871s