使用 glRotatef() 时的 OpenGL 坐标问题

Posted

技术标签:

【中文标题】使用 glRotatef() 时的 OpenGL 坐标问题【英文标题】:OpenGL issue with coordinates when using glRotatef() 【发布时间】:2020-01-03 22:07:11 【问题描述】:

我是 OpenGL 的初学者(使用 LWJGL),我正在尝试对模型应用 90 度的旋转。问题是当旋转应用于模型时,它似乎也改变了它的坐标,导致模型被放置在边界之外。我尝试过翻译坐标,但不确定在哪里使用此方法,也不知道要为glTranslate() 使用哪些参数。这是我正在使用的以下代码 sn-p:

public void renderModel(int index) 
    Model model = Editor.models.get(index);
    glMatrixMode(GL_MODELVIEW);

    // apply rotation
    float rotation = 90f;
    glRotate(rotation, 0, 1, 0);

    for (int triangle = 0; triangle < model.face_cnt; triangle++) 
        if (model.face_verts.get(triangle).length == 3) 
            glBegin(GL_TRIANGLES);
         else 
            glBegin(GL_QUADS);
        
        for (int i = 0; i < model.face_verts.get(triangle).length; i++) 
                int point_a = model.face_verts.get(triangle)[i];

                float modelX = (float)((model.vert_x.get(point_a)) + x);
                float modelZ = (float)((model.vert_y.get(point_a)) - z4);
                float modelY = (float)((model.vert_z.get(point_a)) + y);

                glVertex3f(modelX, -modelZ, -modelY); // draw
        
        glEnd();
    

【问题讨论】:

【参考方案1】:

不要将平移添加到顶点坐标(删除+ x- z4+ y)。

旋转模型然后平移它。 glTranslate 必须在 glRotate 之前完成,因为传统的 OpenGL 矩阵运算指定一个矩阵并将当前矩阵乘以新矩阵:

public void renderModel(int index) 
    Model model = Editor.models.get(index);
    glMatrixMode(GL_MODELVIEW);

    // apply rotation
    float rotation = 90f;

    glTranslate(x, -z4, y);
    glRotate(rotation, 0, 1, 0);

    for (int triangle = 0; triangle < model.face_cnt; triangle++) 
        if (model.face_verts.get(triangle).length == 3) 
            glBegin(GL_TRIANGLES);
         else 
            glBegin(GL_QUADS);
        
        for (int i = 0; i < model.face_verts.get(triangle).length; i++) 
                int point_a = model.face_verts.get(triangle)[i];

                float modelX = (float)((model.vert_x.get(point_a)));
                float modelZ = (float)((model.vert_y.get(point_a)));
                float modelY = (float)((model.vert_z.get(point_a)));

                glVertex3f(modelX, -modelZ, -modelY); // draw
        
        glEnd();
    

【讨论】:

以上是关于使用 glRotatef() 时的 OpenGL 坐标问题的主要内容,如果未能解决你的问题,请参考以下文章

OpenGL:glRotatef 不工作?

使用 gl.glrotatef 旋转对象

glRotatef() 在 Opengl 中的工作很奇怪

OpenGL glRotatef

OpenGL/GLUT:glTranslatef 和 glRotatef 在绘制立方体之前还是之后?

opengl glrotatef 无法正确旋转