三角扇CCW指定顶点还是CW?
#define FREEGLUT_STATIC
#include <GL/glut.h>
GLfloat nRange=10.0f;
GLfloat xRot=0.0f;
GLfloat yRot=0.0f;
void SetupRC()
{
glClearColor(0.0f,0.0f,0.0f,1.0f);
glColor3f(1.0f,0.0f,0.0f);
}
void RenderScene()
{
glClear(GL_COLOR_BUFFER_BIT);
glPushMatrix();
glRotatef(xRot,1.0f,0.0f,0.0f);
glRotatef(yRot,0.0f,1.0f,0.0f);
glPolygonMode(GL_FRONT,GL_LINE);
glBegin(GL_TRIANGLE_FAN);
glVertex3f(0.0f,0.0f,0.0f);
glVertex3f(5.0f,-1.0f,0.0f);
glVertex3f(7.0f,3.0f,0.0f);
glVertex3f(3.0f,7.0f,0.0f);
glEnd();
glPopMatrix();
glutSwapBuffers();
}
void SpecialKeys(int key,int x,int y)
{
if(key==GLUT_KEY_UP)
xRot-=2.0f;
if(key==GLUT_KEY_DOWN)
xRot+=2.0f;
if(key==GLUT_KEY_LEFT)
yRot+=2.0f;
if(key==GLUT_KEY_RIGHT)
yRot-=2.0f;
glutPostRedisplay();
}
void ChangeSize(int w,int h)
{
if(h==0)
h=1;
glViewport(0,0,w,h);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
if(w<=h)
glOrtho(-nRange,nRange,-nRange,nRange*h/w,1.0f,-1.0f);
else
glOrtho(-nRange,nRange*w/h,-nRange,nRange,1.0f,-1.0f);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glutPostRedisplay();
}
int main(int argc,char** argv)
{
glutInit(&argc,argv);
glutInitWindowSize(800,600);
glutCreateWindow("Testing CW/CCW On Trianglefan");
glutInitDisplayMode(GLUT_RGBA|GLUT_DOUBLE);
glutDisplayFunc(RenderScene);
glutReshapeFunc(ChangeSize);
glutSpecialFunc(SpecialKeys);
SetupRC();
glutMainLoop();
return 0;
}
因为SuperBible中关于TriangleFan的章节在讲述TriangleFan是怎样绘制的时候,是顺时针的。I wonder if it is right. So i did check it.
程序中指定顶点是按照逆时针指定的,并且PolygonMode为GL_LINE(默认的模式为GL_FILL,CCW为正面),从结果可以看出:
正面(CCW方向)是边框模式绘制的,背面(CW方向)是填充绘制的。
有图为证:

浙公网安备 33010602011771号