回 帖 发 新 帖 刷新版面

主题:[讨论]OpenGL中 球体的正面和反面是如何定义的?(牛仔请进!)

牛仔的教程里讲述了多边形的front face 和back face,详见http://bbs.pfan.cn/post-184769.html 的3楼,
但是现在我用glutSolidSphere函数画一个球体,那么球体的正面和反面是如何定义的呢?

[size=5][b]另外,如何用OpenGL画半个球?[/b][/size]

谢谢解答!

回复列表 (共8个回复)

沙发

球体的内部是反面。
绘制半个球还是自己绘网格。

板凳


但是网格怎么绘制呢???

3 楼

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 楼

GLdouble clip_plane[] = {0.0, 1.0, 0.0, 0.25};

--> 按照注释,最后一个值应该是0.15

5 楼

我所说的是使用glut绘制球这样一个假定为前提的,所以才能推出内部是反面

6 楼


牛仔解答的很到位!谢谢!!!

7 楼

牛仔,如果是绘制二维图形的话,很容易判断正面和反面,比如说在平面上绘制一个四边形:


[img]C:\Users\freshman\Desktop\1.bmp[/img]

[size=4]但是如果依次指定立方体的八个顶点来绘制一个立方体(三维图形),那么如何判断立方体的六个面哪些是正面?哪些是反面?[/size]

[img]C:\Users\freshman\Desktop\2.bmp[/img]

8 楼

传说中的硬盘图……

[quote]我所说的是使用glut绘制球这样一个假定为前提的,所以才能推出内部是反面[/quote]
我昨天有些死抠定义了。其实cgl_lgs这样理解并没有问题。向cgl_lgs致歉。

判断是否是正面,最简单的方法就是运行的时候用glEnable(GL_CULL_FACE)加上glCullFace(GL_BACK),然后看它是否会被剔除。被剔除的就是反面,否则就是正面。
作为一个按照正确方法绘制的球体(例如:用glutSolidSphere),不管它怎么旋转,观察者可以看到的那些图元始终是正面。换句话说,不管是否使用glEnable(GL_CULL_FACE),得到的效果应该一致,或者基本一致。
除了球体,其它的物体一般也是遵循这种规则。

我来回复

您尚未登录,请登录后再回复。点此登录或注册