使用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 在 C++ 中绘制具有大量数据点的散点图的最佳方法