真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

OpenGL實(shí)現(xiàn)貝塞爾曲線或曲面的方法

這篇文章主要講解了OpenGL實(shí)現(xiàn)貝塞爾曲線或曲面的方法,內(nèi)容清晰明了,對此有興趣的小伙伴可以學(xué)習(xí)一下,相信大家閱讀完之后會有幫助。

成都創(chuàng)新互聯(lián)是專業(yè)的平安網(wǎng)站建設(shè)公司,平安接單;提供網(wǎng)站制作、網(wǎng)站設(shè)計(jì),網(wǎng)頁設(shè)計(jì),網(wǎng)站設(shè)計(jì),建網(wǎng)站,PHP網(wǎng)站建設(shè)等專業(yè)做網(wǎng)站服務(wù);采用PHP框架,可快速的進(jìn)行平安網(wǎng)站開發(fā)網(wǎng)頁制作和功能擴(kuò)展;專業(yè)做搜索引擎喜愛的網(wǎng)站,專業(yè)的做網(wǎng)站團(tuán)隊(duì),希望更多企業(yè)前來合作!

理論基礎(chǔ)

貝塞爾曲線和曲面:OpenGL只能直接繪制基本圖元,對于曲線和曲面我們一般采用一系列線段或多邊形來模擬的,這樣當(dāng)線段或多邊形增多時必定很耗性能。其實(shí)對于這種曲線和曲面,我們可以使用一些控制點(diǎn),通過求值器程序先計(jì)算出坐標(biāo)等信息,然后直接用這些數(shù)據(jù)繪制,這樣不僅節(jié)省內(nèi)存,還提高了模擬曲線或曲面的精度(本質(zhì)還是通過線段或多邊形繪制的,只是求值器提前算出了曲線或曲面的頂點(diǎn)信息)。

求值器使用一般步驟:1.啟用求值器 2.定義求值器 3.執(zhí)行求值器。

注釋:OpenGl3.1后,本節(jié)內(nèi)容都已經(jīng)廢棄了,這些頂點(diǎn)著色器都可以實(shí)現(xiàn)了。

代碼示例

1、曲線

#include "GLTools.h"

#ifdef __APPLE__
#include 
#else
#define FREEGLUT_STATIC
#include 
#endif

//控制點(diǎn)
GLfloat ctrlpoints[4][3] = {
 { -4.0, -4.0, 0.0}, { -2.0, 4.0, 0.0},
 {2.0, -4.0, 0.0}, {4.0, 4.0, 0.0}};

void init(void)
{
 glClearColor(0.0, 0.0, 0.0, 0.0);
 glShadeModel(GL_FLAT);
 //定義一維求值器
 glMap1f(GL_MAP1_VERTEX_3, 0.0, 1.0, 3, 4, &ctrlpoints[0][0]);
 //啟動求職器
 glEnable(GL_MAP1_VERTEX_3);
}

void display(void)
{
 int i;

 glClear(GL_COLOR_BUFFER_BIT);
 glColor3f(1.0, 1.0, 1.0);
 glBegin(GL_LINE_STRIP);
 for (i = 0; i <= 30; i++)
  glEvalCoord1f((GLfloat) i/30.0);//執(zhí)行求值器,每執(zhí)行一次產(chǎn)生一個坐標(biāo)
 glEnd();

 //繪制4個控制點(diǎn)
 glPointSize(5.0);
 glColor3f(1.0, 1.0, 0.0);
 glBegin(GL_POINTS);
 for (i = 0; i < 4; i++)
  glVertex3fv(&ctrlpoints[i][0]);
 glEnd();
 glFlush();
}

void reshape(int w, int h)
{
 glViewport(0, 0, (GLsizei) w, (GLsizei) h);
 glMatrixMode(GL_PROJECTION);
 glLoadIdentity();
 if (w <= h)
  glOrtho(-5.0, 5.0, -5.0*(GLfloat)h/(GLfloat)w,
    5.0*(GLfloat)h/(GLfloat)w, -5.0, 5.0);
 else
  glOrtho(-5.0*(GLfloat)w/(GLfloat)h,
    5.0*(GLfloat)w/(GLfloat)h, -5.0, 5.0, -5.0, 5.0);
 glMatrixMode(GL_MODELVIEW);
 glLoadIdentity();
}

void keyboard(unsigned char key, int x, int y)
{
 switch (key) {
  case 27:
   exit(0);
   break;
 }
}

int main(int argc, char** argv)
{
 glutInit(&argc, argv);
 glutInitDisplayMode (GLUT_SINGLE | GLUT_RGB);
 glutInitWindowSize (500, 500);
 glutInitWindowPosition (100, 100);
 glutCreateWindow (argv[0]);
 init ();
 glutDisplayFunc(display);
 glutReshapeFunc(reshape);
 glutKeyboardFunc (keyboard);
 glutMainLoop();
 return 0;
}

OpenGL實(shí)現(xiàn)貝塞爾曲線或曲面的方法

2、曲面

#include "GLTools.h"

#ifdef __APPLE__
#include 
#else
#define FREEGLUT_STATIC
#include 
#endif

GLfloat ctrlpoints[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}}
};

GLfloat texpts[2][2][2] = {{{0.0, 0.0}, {0.0, 1.0}},
 {{1.0, 0.0}, {1.0, 1.0}}};

void display(void)
{
 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
 glColor3f(1.0, 1.0, 1.0);
 glEvalMesh3(GL_FILL, 0, 20, 0, 20);//glMapGrid2f()均勻產(chǎn)生坐標(biāo)值,這里執(zhí)行繪制
 glFlush();
}

#define imageWidth 64
#define imageHeight 64
GLubyte image[3*imageWidth*imageHeight];
//紋理數(shù)據(jù)
void makeImage(void)
{
 int i, j;
 float ti, tj;

 for (i = 0; i < imageWidth; i++) {
  ti = 2.0*3.14159265*i/imageWidth;
  for (j = 0; j < imageHeight; j++) {
   tj = 2.0*3.14159265*j/imageHeight;

   image[3*(imageHeight*i+j)] = (GLubyte) 127*(1.0+sin(ti));
   image[3*(imageHeight*i+j)+1] = (GLubyte) 127*(1.0+cos(2*tj));
   image[3*(imageHeight*i+j)+2] = (GLubyte) 127*(1.0+cos(ti+tj));
  }
 }
}

void init(void)
{
 //定義了兩個求值器程序
 glMap2f(GL_MAP2_VERTEX_3, 0, 1, 3, 4,
   0, 1, 12, 4, &ctrlpoints[0][0][0]);
 glMap2f(GL_MAP2_TEXTURE_COORD_2, 0, 1, 2, 2,
   0, 1, 4, 2, &texpts[0][0][0]);
 glEnable(GL_MAP2_TEXTURE_COORD_2);
 glEnable(GL_MAP2_VERTEX_3);
 glMapGrid2f(20, 0.0, 1.0, 20, 0.0, 1.0);//均勻產(chǎn)生坐標(biāo)

 //紋理屬性設(shè)置
 makeImage();
 glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_DECAL);
 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
 glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, imageWidth, imageHeight, 0, GL_RGB, GL_UNSIGNED_BYTE, image);
 glEnable(GL_TEXTURE_2D);
 glEnable(GL_DEPTH_TEST);
 glShadeModel (GL_FLAT);
}

void reshape(int w, int h)
{
 glViewport(0, 0, (GLsizei) w, (GLsizei) h);
 glMatrixMode(GL_PROJECTION);
 glLoadIdentity();
 if (w <= h)
  glOrtho(-4.0, 4.0, -4.0*(GLfloat)h/(GLfloat)w,
    4.0*(GLfloat)h/(GLfloat)w, -4.0, 4.0);
 else
  glOrtho(-4.0*(GLfloat)w/(GLfloat)h,
    4.0*(GLfloat)w/(GLfloat)h, -4.0, 4.0, -4.0, 4.0);
 glMatrixMode(GL_MODELVIEW);
 glLoadIdentity();
 glRotatef(85.0, 1.0, 1.0, 1.0);
}

void keyboard(unsigned char key, int x, int y)
{
 switch (key) {
  case 27:
   exit(0);
   break;
 }
}

int main(int argc, char** argv)
{
 glutInit(&argc, argv);
 glutInitDisplayMode (GLUT_SINGLE | GLUT_RGB | GLUT_DEPTH);
 glutInitWindowSize (500, 500);
 glutInitWindowPosition (100, 100);
 glutCreateWindow (argv[0]);
 init ();
 glutDisplayFunc(display);
 glutReshapeFunc(reshape);
 glutKeyboardFunc(keyboard);
 glutMainLoop();
 return 0;

}

OpenGL實(shí)現(xiàn)貝塞爾曲線或曲面的方法

看完上述內(nèi)容,是不是對OpenGL實(shí)現(xiàn)貝塞爾曲線或曲面的方法有進(jìn)一步的了解,如果還想學(xué)習(xí)更多內(nèi)容,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。


本文名稱:OpenGL實(shí)現(xiàn)貝塞爾曲線或曲面的方法
本文地址:http://weahome.cn/article/ppehis.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部