使用OpenGL绘制时钟的小时标记

Posted

技术标签:

【中文标题】使用OpenGL绘制时钟的小时标记【英文标题】:Drawing hour marks of a clock using OpenGL 【发布时间】:2013-10-02 04:26:55 【问题描述】:

这是我的代码:

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 但无论我如何使用它都不起作用。

【问题讨论】:

看来您使用的是透视投影矩阵,而不是正交投影矩阵。这就是它看起来“3D”的原因。也许有人可以为您进一步解释。 你也会得到一些人告诉你这是做事的老方法(确实如此),但如果这是你在课堂上学习的,那么这就是你的教授会的期待你的到来。 【参考方案1】:

3d 问题

gluPerspective 生成一个perspective projection。要完成您的需要,您应该申请 orthographic projection。

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

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

位置问题

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

至于矩阵的推送/弹出,它基本上是一个 4x4 矩阵的stack,详细说明了转换。我确信它的工作原理是

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();

【讨论】:

非常感谢您的回答,现在一切正常,我已经查看了一些 OpenGL 并结合您的回答很好:) 顺便说一句,我使用 glOrtho(-w/40,w/40, -h/40,h/40,1.0f,1000.0f) 有一个很好的视野,40 刚好足够近,我能看清楚,反正现在很好,谢谢

以上是关于使用OpenGL绘制时钟的小时标记的主要内容,如果未能解决你的问题,请参考以下文章

如何在 OpenGL 3.2 中绘制全屏四边形?

使用 OpenGL 在 C++ 中绘制具有大量数据点的散点图的最佳方法

如何使用 OpenGL 保存 OpenGL 绘制?

OpenGL——点的绘制(使用OpenGL来绘制可旋转坐标系的螺旋线)

(第24讲) 示例24-- OpenGL绘制功能

OpenGL 440 - 控制片段中的线条粗细。