ZZ坐标不匹配

时间:2014-10-02 14:16:15

标签: c++ opengl glut

我在c ++中有这个代码,基本上使用GlutSolidCube(1)创建一系列多维数据集。

我做了一个rescale,让任何元素的宽度为8,高度为5的立方体都是常量。 ZZ值用于绘制不同类型的东西。

问题在于立方体之间的距离没有意义:如果我在ZZ中绘制一个具有2个单位的立方体,那么下一个立方体在2 ZZ中开始是否正确,对吧?为什么结果不同?

以下是代码:

#include "stdafx.h"
#include "glut.h"

void reshape(int w, int h) {
    float xmin = -10., xmax = 10., ymin = -2., ymax = 10.;
    float ratio = (xmax - xmin) / (ymax - ymin);
    float aspect = (float)w / h;
    glViewport(0, 0, w, h);
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();
    glOrtho(xmin, xmax, ymin, ymax,-2,30); 
    if (ratio < aspect)
        glScalef(ratio / aspect, 1., 1.);
    else
        glScalef(1., aspect / ratio, 1.);
}

void myDisplay(void)
{
    glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
    glClear(GL_COLOR_BUFFER_BIT);
    glColor3f(1.0f, 1.0f, 1.0f);


    glMatrixMode(GL_MODELVIEW);

    //Margem 1
    glPushMatrix();
    glColor3f(0.0f, 0.4f, 0.0f);
    glRotatef(90.0, 1.0, 0.0, 0.0);
    glScalef(8.0, 5.0, 2.0);
    glTranslatef(0.0, 0.0, 0.0);
    glutSolidCube(1);
    glPopMatrix();

    //Estrada
    glPushMatrix();
    glColor3f(1.0f, 1.0f, 1.0f);
    glRotatef(90.0, 1.0, 0.0, 0.0);
    glScalef(8.0, 5.0, 3.0);
    glTranslatef(0.0, 0.0, -1.);
    glutSolidCube(1);
    glPopMatrix();

    glFlush();
}

void main (int argc,char** argv) {
    glutInit(&argc,argv);
    glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);
    glutInitWindowSize(400, 400);
    glutInitWindowPosition(-1, -1);
    glutCreateWindow("Teste");
    glutDisplayFunc(myDisplay);
    glutReshapeFunc(reshape);
    glutMainLoop();
}

结果图片:

Compilation of the code above

If Translation before Scaling

1 个答案:

答案 0 :(得分:1)

根据您的GL电话,图像正常。默认情况下,OpenGL相机向下看负Z轴(即Z轴指向它)。您首先围绕X轴旋转90度绘制绿色框,这使Z点向下,Y朝向相机。然后,您将Z(现在的上下轴)缩放2.0,最后绘制立方体。立方体的Z大小为1(来自glutSolidCube())乘以2.0(比例),总共2个单位。

对于白色立方体,您以相同的旋转开始,将Z缩放3.0,并沿负缩放的Z轴平移1.0。这相当于向上3个未缩放单位,并且立方体的Z维度也为3(从glutSolidCube()乘以3.0的比例为1)。因此,它更大,更高于绿色。

我不清楚你想要达到什么目标,所以我无法建议适当的操作。


作为旁注,您应该使用glOrtho来设置投影矩阵,而不是模型视图。