OpenGL教程之二次曲面

这篇博客介绍了如何使用OpenGL进行二次曲面的绘制,包括立方体、圆柱体、圆盘、球体和圆锥体等对象。通过GLUquadricObj对象和不同的参数,实现了纹理映射和平滑法向量,展示了在3D空间中创建复杂形状的方法。文章还提供了键盘输入控制不同对象的展示,并详细解释了代码实现。
摘要由CSDN通过智能技术生成

Jeff Molofee(NeHe)的OpenGL教程
- 二次曲面

原 文Lesson 18: Quadrics
译 者sakura

  二次曲面是一种画复合对象的方法,这种方法通常并不需要很多的三角形。我们将要使用第七课的代码。我们将要增加7个变量以及修改纹理以增加一些变化 :

  
#include <windows.h>               // Header File For Windows
  #include <stdio.h>                // Header File For Standard Input/Output
  #include <gl/gl.h>                // Header File For The OpenGL32 Library
  #include <gl/glu.h>                // Header File For The GLu32 Library
  #include <gl/glaux.h>               // Header File For The GLaux Library

  HDC    hDC=NULL;               // Private GDI Device Context
  HGLRC   hRC=NULL;               // Permanent Rendering Context
  HWND    hWnd=NULL;               // Holds Our Window Handle
  HINSTANCE hInstance;               // Holds The Instance Of The Application

  bool  keys[256];                // Array Used For The Keyboard Routine
  bool  active=TRUE;               // Window Active Flag Set To TRUE By Default
  bool  fullscreen=TRUE;         // Fullscreen Flag Set To Fullscreen Mode By Default
  bool  light;                  // Lighting ON/OFF
  bool  lp;                    // L Pressed?
  bool  fp;                    // F Pressed?
  bool  sp;                    // Spacebar Pressed? ( NEW )

  int   part1;                  // Start Of Disc ( NEW )
  int   part2;                  // End Of Disc ( NEW )
  int   p1=0;                   // Increase 1 ( NEW )
  int   p2=1;                   // Increase 2 ( NEW )

  GLfloat xrot;                   // X Rotation
  GLfloat yrot;                   // Y Rotation
  GLfloat xspeed;                 

要绘制双三次Bezier曲面,可以使用OpenGL中的glMap2f和glEvalMesh2函数。首先,需要使用glMap2f函数来设置控制点(CP)和曲面的参数范围。使用glMap2f函数可以将CP映射到二维参数空间,这个过程类似于将一个函数的自变量映射到函数图像上。 接下来,使用glEvalMesh2函数来计算曲面上的顶点。glEvalMesh2函数会自动计算曲面上的点,并将它们存储在顶点缓冲区中,可以使用OpenGL的其他函数来绘制这些点。 下面是一段OpenGL代码,可以绘制一个简单的双三次Bezier曲面: ```C++ // 设置控制点和参数范围 GLfloat ctrlpoints[4][4][3] = { {{-1.5, -1.5, 0.0}, {-0.5, -1.5, 1.0}, {0.5, -1.5, -1.0}, {1.5, -1.5, 0.0}}, {{-1.5, -0.5, 1.0}, {-0.5, -0.5, 3.0}, {0.5, -0.5, -3.0}, {1.5, -0.5, 1.0}}, {{-1.5, 0.5, -1.0}, {-0.5, 0.5, -3.0}, {0.5, 0.5, 3.0}, {1.5, 0.5, -1.0}}, {{-1.5, 1.5, 0.0}, {-0.5, 1.5, 1.0}, {0.5, 1.5, -1.0}, {1.5, 1.5, 0.0}} }; glMap2f(GL_MAP2_VERTEX_3, 0.0, 1.0, 3, 4, 0.0, 1.0, 12, 4, &ctrlpoints[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); ``` 在这个例子中,我们使用了一个4x4的控制点矩阵。glMap2f函数将这些控制点映射到二维参数空间,并设置参数范围。glEnable函数开启了自动计算曲面上的顶点和法向量。glMapGrid2f函数设置了绘制曲面的网格,glEvalMesh2函数计算并绘制曲面上的顶点。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值