我在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();
}
结果图片:
答案 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
来设置投影矩阵,而不是模型视图。