主题:[讨论]OpenGL中 球体的正面和反面是如何定义的?(牛仔请进!)
drasty
[专家分:0] 发布于 2011-08-11 09:46:00
牛仔的教程里讲述了多边形的front face 和back face,详见http://bbs.pfan.cn/post-184769.html 的3楼,
但是现在我用glutSolidSphere函数画一个球体,那么球体的正面和反面是如何定义的呢?
[size=5][b]另外,如何用OpenGL画半个球?[/b][/size]
谢谢解答!
最后更新于:2011-08-11 10:38:00
回复列表 (共8个回复)
沙发
cgl_lgs [专家分:21040] 发布于 2011-08-11 11:13:00
球体的内部是反面。
绘制半个球还是自己绘网格。
板凳
drasty [专家分:0] 发布于 2011-08-11 20:44:00
但是网格怎么绘制呢???
3 楼
eastcowboy [专家分:25370] 发布于 2011-08-11 23:33:00
1、OpenGL的基础概念里面,没有“球体”这种东西。所以也没有球体的正反面。
OpenGL只认识“图元”,也就是点、线、三角形、四边形、多边形,等等这些。对于三角形来说,如果三个顶点在屏幕上是逆时针排列,则认为它的正面是朝向我们的。(可以通过glFrontFace修改)
在OpenGL看来,球体其实是若干个图元(比如:三角形)拼凑起来的。球体没有正面反面,但组成它的每个图元(比如:三角形)却有正面反面。
1楼cgl_lgs所说的并不正确。
判断一个面是否是正面,应该根据顶点在屏幕上的排列顺序(顺时针、逆时针)来确定。也可以说是根据图元与观察者之间的相对位置来确定。
换句话说,正面、反面并不是绝对的。对于一个三角形的两个面A、B,如果现在A是正面,B是反面,则将它旋转之后,有可能A变为反面,B变为正面。
2、绘制半个球体的做法。
1) 网格。其实就是自己通过编程计算出若干的顶点坐标,组成若干的三角形,来构成这个球体。这个做法简单有效,一旦顶点计算完毕之后,绘制所需的开销小。
具体做法就不仔细说了,主要就是计算顶点坐标。
2) glutSolidSphere + 剪裁平面。这个做法比较偷懒,绘制的还是整个球体,但通过剪裁平面对它进行切割,使得只剩下一部分,成为半球。
标准OpenGL至少支持6个剪裁平面,可以尽情的进行切割。呵呵,思路逐渐的被引导到某个流行的手机游戏上去了……
代码:
// 剪裁平面方程:0*x + 1*y + 0*z + 0.15 = 0
// 也就是y = -0.15,这样切割可以得到大半个球体
// 如果最后一个值写为0,就变成了y = 0,这样可以得到精确的半球
GLdouble clip_plane[] = {0.0, 1.0, 0.0, 0.25};
glClear(GL_COLOR_BUFFER_BIT);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glClipPlane(GL_CLIP_PLANE0, clip_plane);
glEnable(GL_CLIP_PLANE0);
glutSolidSphere(0.5, 20, 20);
glutSwapBuffers();
glutReportErrors();
4 楼
eastcowboy [专家分:25370] 发布于 2011-08-11 23:36:00
GLdouble clip_plane[] = {0.0, 1.0, 0.0, 0.25};
--> 按照注释,最后一个值应该是0.15
5 楼
cgl_lgs [专家分:21040] 发布于 2011-08-12 10:24:00
我所说的是使用glut绘制球这样一个假定为前提的,所以才能推出内部是反面
6 楼
drasty [专家分:0] 发布于 2011-08-12 18:55:00
牛仔解答的很到位!谢谢!!!
7 楼
drasty [专家分:0] 发布于 2011-08-12 19:14:00
牛仔,如果是绘制二维图形的话,很容易判断正面和反面,比如说在平面上绘制一个四边形:
[img]C:\Users\freshman\Desktop\1.bmp[/img]
[size=4]但是如果依次指定立方体的八个顶点来绘制一个立方体(三维图形),那么如何判断立方体的六个面哪些是正面?哪些是反面?[/size]
[img]C:\Users\freshman\Desktop\2.bmp[/img]
8 楼
eastcowboy [专家分:25370] 发布于 2011-08-13 00:34:00
传说中的硬盘图……
[quote]我所说的是使用glut绘制球这样一个假定为前提的,所以才能推出内部是反面[/quote]
我昨天有些死抠定义了。其实cgl_lgs这样理解并没有问题。向cgl_lgs致歉。
判断是否是正面,最简单的方法就是运行的时候用glEnable(GL_CULL_FACE)加上glCullFace(GL_BACK),然后看它是否会被剔除。被剔除的就是反面,否则就是正面。
作为一个按照正确方法绘制的球体(例如:用glutSolidSphere),不管它怎么旋转,观察者可以看到的那些图元始终是正面。换句话说,不管是否使用glEnable(GL_CULL_FACE),得到的效果应该一致,或者基本一致。
除了球体,其它的物体一般也是遵循这种规则。
我来回复