#include
#include
void myinit(void)
{
glClearColor(0.0, 0.0, 0.0, 0.0);
glDepthFunc(GL_LESS);
glEnable(GL_DEPTH_TEST);
glShadeModel(GL_FLAT);
glDepthRange(0.0, 1.0);
}
void drawRects(GLenum mode)
{
glPushMatrix();
glTranslatef( -1.0f,0.0f,0.0f);
glBegin(GL_QUADS);
glColor3f(1.0, 1.0, 0.0);
glVertex3i(2, 0, 0);
glVertex3i(2, 6, 0);
glVertex3i(6, 6, 0);
glVertex3i(6, 0, 0);
glEnd();
glBegin(GL_TRIANGLES);
glColor3f(0.0, 1.0, 1.0);
glVertex3i(3, 2, -1);
glVertex3i(3, 8, -1);
glVertex3i(8, 2, -1);
glEnd();
glBegin(GL_TRIANGLES);
glColor3f(1.0, 0.0, 1.0);
glVertex3i(0, 2, -2);
glVertex3i(0, 7, -2);
glVertex3i(5, 2, -2);
glEnd();
glPopMatrix();
}
void display(void)
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
drawRects(GL_RENDER);
glutSwapBuffers();
}
void myReshape(int w, int h)
{
glViewport(0, 0, w, h);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(65.0, (GLfloat) 1.0, 1.0, 20.0);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glTranslatef (-3.0, -3.0, -8.0);
}
static void key(unsigned char k, int x, int y)
{
switch (k) {
case 27: /* Escape */
exit(0);
break;
default:
return;
}
glutPostRedisplay();
}
int main(int argc, char **argv)
{
glutInitWindowSize(200, 200);
glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH);
glutInit(&argc, argv);
glutCreateWindow(argv[0]);
myinit();
glutReshapeFunc(myReshape);
glutDisplayFunc(display);
glutKeyboardFunc(key);
glutMainLoop();
return 0;
}
可以先设置旋转矩阵,再左乘平移矩阵(平移到这个点的), 再用glloadmatrix即可。
当然你也可以用gltranslate + glrotate不过注意次序,这个用的是是惯性坐标
第二种方案
glloadidentity();
gltranslate(鼠标位置,注意windows和你的gl坐标之间的转换);
glrotate(0,0,z当前的选择角, 如果需要动画,就要不断跟新);
绘制直线
第一种方案: z为本帧动画中,直线绕自己中心旋转的角度
cos(z) -sin(z) 0 0
sin(z) cos(z) 0 0
0 0 1 0
0 0 0 1
乘以
1 0 0 直线中点x
0 1 0 直线中点y
0 0 1 0
0 0 0 1
让后取结果的转置矩阵,调用glloadmatrix(),
最后再绘制直线即可