Opengl 轴旋转的三维字母不';行不通

Opengl 轴旋转的三维字母不';行不通,opengl,Opengl,我需要使用opengl绘制一个3d字母a和轴。为了画字母A我用z==50画二维字母A,然后用z=50-偏移量画字母A 这里是我的opengl和字母a坐标初始化 glutInit(&argc,argv); glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH); glutInitWindowSize(WIDTH, HEIGHT); glutCreateWindow("PROJECT"); glClearColor(1.0, 1.0,

我需要使用opengl绘制一个3d字母
a
和轴。为了画字母
A
我用
z==50
画二维字母
A
,然后用
z=50-偏移量
画字母
A

这里是我的opengl和字母a坐标初始化

glutInit(&argc,argv);
glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH);
glutInitWindowSize(WIDTH, HEIGHT);
glutCreateWindow("PROJECT");
glClearColor(1.0, 1.0, 1.0, 0.0);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho(0, WIDTH, 0, HEIGHT, -100, 100);    
glMatrixMode(GL_MODELVIEW);

p1.x = 0; p1.y = 400 ; p1.z = 50;
p2.x = -300; p2.y = -500; p2.z = 50;
p3.x = -200; p3.y = -500; p3.z = 50;
p4.x = -100; p4.y = -200; p4.z = 50;
p5.x = 100; p5.y = -200; p5.z = 50;
p6.x = 200; p6.y = -500; p6.z = 50;
p7.x = 300; p7.y = -500; p7.z = 50;

p8.x = -130; p8.y = -100; p8.z = 50;
p9.x = 130; p9.y = -100; p9.z = 50;
p10.x = 0; p10.y = 100; p10.z = 50;

glutDisplayFunc(display);
glutMainLoop();
在功能显示中,我绘制轴和两个字母
A

void display() {
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

    axes();
    drawLetter(0);
    drawLetter(100);

glFlush();
glutSwapBuffers();
}
这里是轴的初始值

float angle = 17;

float AXIS_X[3] = { 250, 0, 0 },
      AXIS_Y[3] = { 0, 250, 0 },
      AXIS_Z[3] = { 0, 0, 150 };
我像这样画斧子

void axes() {

glPushMatrix();

glTranslatef(WIDTH/2, HEIGHT/2, 0);
glBegin(GL_LINES);
    glColor3f(1, 0, 0);
    glVertex3f(0.0, 0.0, 0.0);
    glVertex3fv(AXIS_X);
glEnd();
glBegin(GL_LINES);
    glColor3f(0, 0, 1);
    glVertex3f(0.0, 0.0, 0.0);
    glVertex3fv(AXIS_Y);
glEnd();
glBegin(GL_LINES);
    glColor3f(0, 1, 0);
    glVertex3f(0.0, 0.0, 0.0);
    glVertex3fv(AXIS_Z);
glEnd();

glPopMatrix();

}
这是这封信的密码

void drawLetter(float offset) {

glPushMatrix();

glTranslatef(WIDTH/2, HEIGHT/2, 0);
glScalef(0.3, 0.3, 0.3);
glBegin(GL_POLYGON);
    glColor3f(1.0, 0.0, 0.0);
    glVertex3f(p1.x, p1.y, p1.z - offset);
    glVertex3f(p2.x, p2.y, p2.z - offset);
    glVertex3f(p3.x, p3.y, p3.z - offset);
    glVertex3f(p10.x, p10.y, p10.z - offset);
glEnd();

glBegin(GL_POLYGON);
    glColor3f(1.0, 0.0, 0.0);
    glVertex3f(p1.x, p1.y, p1.z - offset);
    glVertex3f(p10.x, p10.y, p10.z - offset);
    glVertex3f(p6.x, p6.y, p6.z - offset);
    glVertex3f(p7.x, p7.y, p7.z - offset);
glEnd();

glBegin(GL_POLYGON);
    glColor3f(1.0, 0.0, 0.0);
    glVertex3f(p8.x, p8.y, p8.z - offset);
    glVertex3f(p4.x, p4.y, p4.z - offset);
    glVertex3f(p5.x, p5.y, p5.z - offset);
    glVertex3f(p9.x, p9.y, p9.z - offset);
glEnd();

glPopMatrix();

}
默认情况下是这样的

void axes() {

glPushMatrix();

glTranslatef(WIDTH/2, HEIGHT/2, 0);
glBegin(GL_LINES);
    glColor3f(1, 0, 0);
    glVertex3f(0.0, 0.0, 0.0);
    glVertex3fv(AXIS_X);
glEnd();
glBegin(GL_LINES);
    glColor3f(0, 0, 1);
    glVertex3f(0.0, 0.0, 0.0);
    glVertex3fv(AXIS_Y);
glEnd();
glBegin(GL_LINES);
    glColor3f(0, 1, 0);
    glVertex3f(0.0, 0.0, 0.0);
    glVertex3fv(AXIS_Z);
glEnd();

glPopMatrix();

}

但是当我添加
glRotatef(角度,0.0,1.0,0.0)
axes()之前(
看起来像这样(简单的绿线是)

有什么问题吗


还有一个问题-如何在不同平面(xy、yz、xz)上创建正交投影和透视投影?我需要使用
glFrustrum
glOrtho

通常您希望按以下顺序执行操作:

  • 鳞片
  • 轮换
  • 翻译
  • 由于OpenGL使用列主矩阵,因此您需要:

  • 翻译
  • 轮换
  • 鳞片
  • 注意:从概念上讲,顺序是相同的,当您使用主列时,只需以不同的顺序执行矩阵乘法

    我首先要解决这个问题

    另一个需要注意的重要事项是,如果在此代码中在
    drawLetter(…)
    轴(…)
    之外旋转,旋转将在多个帧上累积(因为您不加载标识矩阵)。您应该为modelview的每个帧加载一个标识矩阵,或者在PushMatrix/PopMatrix块内进行旋转(无论如何,您都需要这样做才能正确旋转)