R257983 2023-11-18 22:18 采纳率: 20%
浏览 11

为何绘制不出贝塞尔曲面

#include <glut.h>
GLfloat controlPoints[4][4][3] = {
    {{-1.5, -1.5, 4.0}, {-0.5, -1.5, 2.0}, {0.5, -1.5, -1.0}, {1.5, -1.5, 2.0}},
    {{-1.5, -0.5, 1.0}, {-0.5, -0.5, 3.0}, {0.5, -0.5, 0.0}, {1.5, -0.5, -1.0}},
    {{-1.5, 0.5, 4.0}, {-0.5, 0.5, 0.0}, {0.5, 0.5, 3.0}, {1.5, 0.5, 4.0}},
    {{-1.5, 1.5, -2.0}, {-0.5, 1.5, -2.0}, {0.5, 1.5, 0.0}, {1.5, 1.5, -1.0}}
};

void drawBezierSurface() {
    // 设置曲面颜色
    glColor3f(0, 0, 0); // 白色

    glMap2f(GL_MAP2_VERTEX_3, 0, 1, 3, 4, 0, 1, 12, 4, &controlPoints[0][0][0]);

    glEnable(GL_MAP2_VERTEX_3);
    glEnable(GL_AUTO_NORMAL);

    glMapGrid2f(20, 0.0, 1.0, 20, 0.0, 1.0);

    glEvalMesh2(GL_FILL, 0, 20, 0, 20);
}


void display() {
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();

    gluPerspective(45.0, 1.0, 1.0, 100.0);  // 透视投影设置

    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();

    gluLookAt(0.0, 0.0, 5.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0);  // 设置视点和观察目标

    drawBezierSurface();

    glutSwapBuffers();
}

为何绘制不出贝塞尔曲面,该如何解决?

  • 写回答

2条回答 默认 最新

  • K_n_i_g_h_t_1990 2023-11-18 22:29
    关注

    你的代码中可能存在以下问题:

    • 你没有设置光照和材质,导致曲面看起来没有明暗变化,可能会被背景色混淆。你可以尝试添加一些光源和设置曲面的颜色和反射属性,以增强曲面的视觉效果。
    • 你没有设置视角和投影的变换矩阵,导致曲面可能会出现变形或裁剪的现象。你可以尝试调整视角和投影的参数,以改善曲面的显示效果。
    • 你没有设置曲面的细分程度,导致曲面可能会出现锯齿或不平滑的现象。你可以尝试增加曲面的细分程度,以提高曲面的质量。

    你的代码要想绘制出贝塞尔曲面,可以参考以下的修改建议:

    • 在你的代码的开头,添加以下的语句,用来引入光照和材质的头文件,并定义一个光源的位置和一个材质的颜色:
    #include <GL/glut.h>
    #include <GL/glu.h>
    #include <GL/gl.h>
    
    // 定义一个光源的位置,为(0, 0, 1, 0),表示无限远的平行光
    GLfloat lightPosition[] = {0.0, 0.0, 1.0, 0.0};
    // 定义一个材质的颜色,为(1, 1, 1, 1),表示白色
    GLfloat materialColor[] = {1.0, 1.0, 1.0, 1.0};
    
    • 在你的drawBezierSurface函数的开头,添加以下的语句,用来启用光照和颜色材质,并设置光源的位置和材质的颜色:
    void drawBezierSurface() {
        // 启用光照和颜色材质
        glEnable(GL_LIGHTING);
        glEnable(GL_LIGHT0);
        glEnable(GL_COLOR_MATERIAL);
    
        // 设置光源的位置和材质的颜色
        glLightfv(GL_LIGHT0, GL_POSITION, lightPosition);
        glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, materialColor);
    
        // 其他的代码不变
        ...
    }
    
    • 在你的display函数的开头,添加以下的语句,用来设置视角和投影的变换矩阵,以改善曲面的显示效果:
    void display() {
        glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
        glMatrixMode(GL_PROJECTION);
        glLoadIdentity();
    
        // 使用gluPerspective函数来设置透视投影,参数分别为视角、宽高比、近裁剪面、远裁剪面
        gluPerspective(45.0, 1.0, 1.0, 100.0);
    
        glMatrixMode(GL_MODELVIEW);
        glLoadIdentity();
    
        // 使用gluLookAt函数来设置视点和观察目标,参数分别为视点的坐标、观察目标的坐标、视线的方向
        gluLookAt(0.0, 0.0, 5.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0);
    
        // 其他的代码不变
        ...
    }
    
    • 在你的display函数的末尾,添加以下的语句,用来设置曲面的细分程度,以提高曲面的质量:
    void display() {
        ...
        // 其他的代码不变
        ...
    
        // 使用glMapGrid2f函数来设置曲面的细分程度,参数分别为u方向的细分数、u方向的范围、v方向的细分数、v方向的范围
        glMapGrid2f(50, 0.0, 1.0, 50, 0.0, 1.0);
    
        // 使用glEvalMesh2函数来绘制曲面,参数分别为绘制模式、u方向的起始索引、u方向的终止索引、v方向的起始索引、v方向的终止索引
        glEvalMesh2(GL_FILL, 0, 50, 0, 50);
    
        glutSwapBuffers();
    }
    
    • 这样,你的代码就可以绘制出一个光滑且有明暗变化的贝塞尔曲面了。你可以运行你的代码,看看效果如何。如果你想调整曲面的形状或颜色,你可以修改你的控制点或材质的值。如果你想调整曲面的视角或大小,你可以修改你的视点或投影的参数。如果你想调整曲面的细分程度,你可以修改你的细分数或范围。希望你能满意你的代码的结果。
    评论

报告相同问题?

问题事件

  • 创建了问题 11月18日

悬赏问题

  • ¥15 matlab数据降噪处理,提高数据的可信度,确保峰值信号的不损失?
  • ¥15 怎么看我在bios每次修改的日志
  • ¥15 python+mysql图书管理系统
  • ¥15 Questasim Error: (vcom-13)
  • ¥15 船舶旋回实验matlab
  • ¥30 SQL 数组,游标,递归覆盖原值
  • ¥15 为什么我的数据接收的那么慢呀有没有完整的 hal 库并 代码呀有的话能不能发我一份并且我用 printf 函数显示处理之后的数据,用 debug 就不能运行了呢
  • ¥20 gitlab 中文路径,无法下载
  • ¥15 用动态规划算法均分纸牌
  • ¥30 udp socket,bind 0.0.0.0 ,如何自动选取用户访问的服务器IP来回复数据