如何用opengl绘制正方体完成马鞍曲面的绘制

用OpenGL绘制贝塞尔曲面的问题
[问题点数:30分,无满意结帖,结帖人Wendy_926]
用OpenGL绘制贝塞尔曲面的问题
[问题点数:30分,无满意结帖,结帖人Wendy_926]
不显示删除回复
显示所有回复
显示星级回复
显示得分回复
只显示楼主
相关推荐:
本帖子已过去太久远了,不再提供回复功能。当前访客身份:游客 [
一切都是简单的,你觉得困难只是因为你还未发觉它是简单的!
:hi,朋友你好,我也做opengl开发, 这是我的博客...
:引用来自“安度”的评论位图不只是2位的非黑即白...
:位图不只是2位的非黑即白吧,还有8位的位图(调色板...
:请问大神,8位索引图,如何做成纹理?
:请问大神,8位索引图,如何做成纹理?
:有帮助啊!!!原来轮廓是这样实现的。其实都要画...
:引用来自“btyam19”的评论大神您好,在下拜读了...
:引用来自“btyam19”的评论大神您好,在下拜读了...
:大神您好,在下拜读了您的文章"EGL工作笔记" 了解...
今日访问:77
昨日访问:166
本周访问:593
本月访问:1325
所有访问:59517
OpenGL超级宝典笔记——曲线和曲面(一)
发表于2年前( 20:37)&&
阅读(1927)&|&评论()
0人收藏此文章,
简单地介绍了OpenGL的GLU库内部支持的一些画曲面的函数
内部支持的表面
GLU库中提供了一些二次曲面的支持。这些二次方程可以渲染球体,圆柱体,圆盘。这些函数有很大的灵活性,我们可以指定圆柱体的一端的半径,然后让另一端的半径为0,这样的话就能构建一个圆锥。我们还可以绘制一个有洞的圆盘。如下图:
这些二次方程对象可以构建出更复杂的模型,例如我们可以用球体,圆柱体,圆锥,圆盘来构建一个3D坐标系的模型。在glTools中有提供了这个函数:
void gltdDrawUnitAxes();
设置二次方程状态
在绘制二次方程对象之前,我们可以为其制定法线向量,纹理坐标等。如果我们每次在绘制这些二次方程对象时,把这些可选项都通过参数的方式传递,那工作量就变得很大。所以OpenGL用二次方程状态对象的方式来实现,这样我们可以通过一些函数来设置这个二次方程状态对象,以后每次绘制二次方程对象的时候只要传递这个二次方程状态,OpenGL就知道是以什么样的方式绘制二次方程对象了。(利用面向对象的方式来达到复用的目的)。
首先我们创建一个二次方程状态对象.
调用函数设置二次方程状态
以二次方程状态对象作为参数,传到绘制二次方程的函数
使用完之后销毁。
GLUquadricObj *pO //创建二次方程状态对象 pObj = gluNewQuadric(); //设置二次方程状态 gluQuadricDrawStyle(pObj, GLU_LINE);
... //销毁 gluDeleteQuadric(pObj);
GLU库的gluNewQuadric()方法不仅仅为GLUQuadricObj对象申请了内存空间,而且还初始化了一些默认值。GLU库有四个函数可以修改这个二次方程对象的状态:
void gluQuadricDrawStyle(GLUquadricObj *obj, GLenum drawStyle);
第一个参数是二次方程对象状态的指针,第二个参数的枚举值如下表:
二次方程对象画成实体
二次方程对象画成线框
二次方程对象画成一组顶点的集合
GLU_SILHOUETTE
类似于线框,但相邻的多边形的边不被绘制。
void gluQuadricNormals(GLUquadricObj *pbj, GLenum normals);
上面的这个函数指定二次方程对象如何生成法线。第二个参数可以是:GLU_NONE不生成法线,GLU_FLAT扁平法线,GLU_SMOOTH平滑法线。
如果指定的是平滑法线,那么每个顶点都指定了一条法线,垂直于被模拟的表面,这样可以产生一个平滑的表面。扁平法线是所有的法线都是面法线,垂直于三角形(多边形)面。
goid gluQuadricOrientation(GLUQuadricObj *obj, GLenum orientation);
上面的这个函数可以指定法线的朝向,指向外面还是只想里面。orientation可以是GLU_OUTSIDE或者是GLU_INSIDE这两个值。OpenGL默认是以GL_CCW逆时针为正方向的。
最后,我们还可以为二次方程表面指定纹理坐标,通过下面的函数调用来实现:
void gluQuadsricTexture(GLUquadricObj *obj, GLenum textureCoords);
textureCoords这个参数可以是GL_TRUE或者GL_FALSE.当为球体和圆柱体生成纹理坐标时,纹理是对称地环绕在球体和圆柱体的表面的。如果应用到圆盘上,那么纹理的中心就是圆盘的中心,然后以线性插值的方式扩展到圆盘的边界。
绘制二次方程图形
void gluSphere(GLUQuadricObj *obj, GLdouble radius, GLint slices, GLint stacks);
上面的函数式绘制球体的函数。第一个参数是指向二次方程状态的指针,第二个参数是球体的半径。第三个参数可以理解为地球的经线的条数。最后一个参数可以理解为纬线的条数。
gltDrawUnitAxes();
GLUquadricObj *quadricObj = gluNewQuadric();
gluQuadricDrawStyle(quadricObj, GLU_LINE);
gluSphere(quadricObj, 0.8, 26, 13);
我们可以通过指定底部的半和顶部的半径(方向是沿z轴正方向向外),还有高度(即圆柱体的长度)来绘制一个圆柱体。绘制圆柱体的函数如下:
void gluCylinder(GLUquadricObj *obj, GLdouble baseRadius, GLdouble topRadius, GLdouble height, GLint slices, GLint stacks);
gltDrawUnitAxes();
GLUquadricObj *quadricObj = gluNewQuadric();
gluQuadricDrawStyle(quadricObj, GLU_LINE);
gluCylinder(quadricObj, 0.7, 0.7, 2, 26, 13);
把顶部半径设置为0.
gluCylinder(quadricObj, 0.7, 0.0, 2, 26, 13);
绘制圆盘的函数
void gluDisk(GLUquadricObj *obj, GLdouble innerRadius, GLdouble outerRadius, GLint slices, GLint loops);
指定内半径为0才是实心的圆盘。
gluDisk(quadricObj, 0.0, 0.7, 26, 13);
gluDisk(quadricObj, 0.2, 0.7, 26, 13); 中间有洞的圆盘。
用二次方程进行建模
下面是一个雪人的例子。这个雪人由3个雪球堆成,由两个小眼睛和一个鼻子。还带了一顶帽子。步骤如下:
先从底部向上使用gluSphere函数绘制三个雪球(使用平移glTranslate)
用gluSphere再绘制两个眼睛,用gluCylinder绘制一个圆锥形的鼻子
使用gluCylinder绘制圆柱体的帽子,再使用gluDisk画帽子的边。
代码示例如下:
#include "gltools.h" #include "math3d.h" #include "glframe.h" #include &stdio.h&
GLFrame objF void SetupRC()
glClearColor(0.3f, 0.3f, 0.5f, 1.0f); //开启深度检测,消除隐藏面 glEnable(GL_DEPTH_TEST);
glEnable(GL_CULL_FACE);
glCullFace(GL_BACK);
glFrontFace(GL_CCW); //开启光照 GLfloat whiteLight[] = {0.05f, 0.05f, 0.05f, 1.0f};
GLfloat sourceLight[] = {0.25f, 0.25f, 0.25f, 1.0f};
GLfloat lightPos[] = {-5.0f, 15.0f, 5.0f, 1.0f};
glEnable(GL_LIGHTING);
glLightModelfv(GL_LIGHT_MODEL_AMBIENT, whiteLight);
glLightfv(GL_LIGHT0, GL_AMBIENT_AND_DIFFUSE, sourceLight);
glLightfv(GL_LIGHT0, GL_POSITION, lightPos);
glEnable(GL_LIGHT0); //开启颜色追踪 glColorMaterial(GL_FRONT, GL_AMBIENT_AND_DIFFUSE);
glEnable(GL_COLOR_MATERIAL);
} void ChangeSize(GLsizei w, GLsizei h)
{ if (h == 0)
glViewport(0, 0, w, h);
GLfloat aspect = (GLfloat)w/(GLfloat)h;
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(35.0, aspect, 1.0, 40.0);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
} void RenderScene()
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); //设置二次方程的状态 GLUquadricObj *quadricObj = gluNewQuadric();
gluQuadricNormals(quadricObj, GLU_SMOOTH);
glPushMatrix();
glTranslatef(0.0f, -.6f, -8.0f);
objFrame.ApplyCameraTransform();
glPushMatrix(); //画三个雪球 glColor3f(1.0f, 1.0f, 1.0f);
gluSphere(quadricObj, .65f, 26, 13);
glTranslatef(0.0f, 0.85f, 0.0f);
gluSphere(quadricObj, 0.42f, 26, 13);
glTranslatef(0.0f, 0.63f, 0.0f);
gluSphere(quadricObj, 0.36f, 26, 13); //画两个眼睛 glTranslatef(-0.2f, 0.1f, 0.31f);
glColor3f(0.0f, 0.0f, 0.0f);
gluSphere(quadricObj, 0.05f, 26, 13);
glTranslatef(0.4f, 0.0f, 0.0f);
gluSphere(quadricObj, 0.05f, 26,13); //画一个鼻子 glTranslatef(-0.2f, -0.08f, 0.03f);
glColor3f(1.0f, 0.3f, 0.3f);
gluCylinder(quadricObj, 0.04f, 0.0f, 0.6f, 26, 13);
glPopMatrix(); //画帽子 glPushMatrix();
glColor3f(0.0f, 0.0f, 0.0f);
glTranslatef(0.0f, 2.2f, 0.0f);
glRotatef(90.0, 1.0f, 0.0f, 0.0f);
gluCylinder(quadricObj, 0.2f, 0.2f, 0.4f, 26, 13);
glDisable(GL_CULL_FACE);
gluDisk(quadricObj, 0.17f, 0.2f, 26, 13);
glTranslatef(0.0f, 0.0f, 0.40f);
gluDisk(quadricObj, 0.0f, 0.4f, 26, 13);
glEnable(GL_CULL_FACE);
glPopMatrix();
glPopMatrix();
glutSwapBuffers();
} //通过按键来移动和旋转 void SpecialKey(int value, int x, int y)
{ if (value == GLUT_KEY_RIGHT)
objFrame.RotateLocalY(0.5f);
} if (value == GLUT_KEY_LEFT)
objFrame.RotateLocalY(-0.5f);
} if (value == GLUT_KEY_UP)
objFrame.MoveUp(0.5f);
} if (value == GLUT_KEY_DOWN)
objFrame.MoveUp(-0.5f);
glutPostRedisplay();
} int main(int args, char **argv)
glutInit(&args, argv);
glutInitDisplayMode(GLUT_DOUBLE | GLUT_DEPTH | GLUT_RGBA);
glutInitWindowSize(800, 600);
glutCreateWindow("snowman");
glutDisplayFunc(RenderScene);
glutReshapeFunc(ChangeSize);
SetupRC();
glutSpecialFunc(SpecialKey);
glutMainLoop(); return 0;
更多开发者职位上
1)">1)">1" ng-class="{current:{{currentPage==page}}}" ng-repeat="page in pages"><li class='page' ng-if="(endIndex<li class='page next' ng-if="(currentPage
相关文章阅读OpenGL如何实现B样条曲线和曲面的绘制(C语言)?_百度知道
OpenGL如何实现B样条曲线和曲面的绘制(C语言)?
谁有C语言写的B样条曲线和曲面的实现代码,要求用opengl实现(包含GL&#47;glut.h的头文件),如果有的话可以发到我邮箱或QQ联系我,好的加分。
提问者采纳
你说的是计算机图形学的课程设计吧,我有C编写的代码,可以运行,是画B样条曲线和曲面的,我发到你邮箱里了,你参考一下吧。
其他类似问题
为您推荐:
b样条曲线的相关知识
等待您来回答
下载知道APP
随时随地咨询
出门在外也不愁opengl 如何画 Nurbs 曲面
[问题点数:50分]
opengl 如何画 Nurbs 曲面
[问题点数:50分]
不显示删除回复
显示所有回复
显示星级回复
显示得分回复
只显示楼主
相关推荐:
匿名用户不能发表回复!|
每天回帖即可获得10分可用分!小技巧:
你还可以输入10000个字符
(Ctrl+Enter)
请遵守CSDN,不得违反国家法律法规。
转载文章请注明出自“CSDN(www.csdn.net)”。如是商业用途请联系原作者。

我要回帖

更多关于 opengl绘制正方体 的文章

 

随机推荐