0

这是我的代码:

void drawClock(void) 
{ 

glClearColor(1.0,1.0,1.0,1.0);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

glColor3f(0.0,0.0,0.0);


for(int i=0; i<12; i++){

    glRotatef(30,0,0,1);
    glTranslatef(5.2,0.0,0.0);
    glutWireCube(2.0);

}

glFlush(); 
} 

这是我的重塑功能(没有它我什么都看不到,虽然我不确定它是如何工作的)

void changeSize(int w, int h) {
// Prevent a divide by zero, when window is too short
// (you cant make a window of zero width).
if(h == 0) h = 1;
float ratio = 1.0* w / h;
// Reset the coordinate system before modifying
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
// Set the viewport to be the entire window
glViewport(0, 0, w, h);
// Set the correct perspective.
gluPerspective(45,ratio,1,1000);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
gluLookAt(0.0,0.0,70.0, 
0.0,0.0,-1.0,
0.0f,1.0f,0.0f);
}

所以我试图用尺寸为 2.0 的线立方体来绘制时钟的小时标记,每个立方体必须距离中心 5.2 个单位。这是一个任务,我知道它可能很简单,但我无法让它正常工作。我的问题是立方体出现在 3D 中,但我希望它们出现在 2D 中,因为我只会看到一张脸。另外,圆圈没有居中,我不明白为什么。我知道我应该使用 pushMatrix 和 popMatrix 但无论我如何使用它都不起作用。

4

1 回答 1

3

3d 问题

gluPerspective做一个透视投影。要完成您需要的工作,您应该应用正交投影

使用您当前的代码执行此操作的最佳方法是让我们glOrtho提供一个左、右、下、上、远、近框,其中所有内容都将“显示”为 2D。试试下面的代码代替gluPerspective.

glOrtho(10.0f,-10.0f,10.0f,-10.0f,10.0f,-10.0f,10.0f);

位置问题

我对转换不太确定,因为我已经有一段时间没有使用即时模式了。请注意,操作顺序会有所不同。

至于矩阵的推送/弹出,它基本上是一堆4x4 矩阵,详细说明了转换。我确信它可以按照以下方式工作

glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glTranslate(x,y,z);// Where x,y,z is the starting point of your clock
for(int i=0; i<12; i++){
    glPushMatrix();
    glRotatef(i * 30,0,0,1);
    glTranslatef(5.2,0.0,0.0);
    glutWireCube(2.0);
    glPopMatrix();
}
于 2013-10-02T11:10:50.463 回答