【问题标题】:OpenGL Drawing "axis"OpenGL绘图“轴”
【发布时间】:2012-02-08 05:59:40
【问题描述】:

对于一个课程作业,我们必须建立一个太阳系的工作模型。我已经用行星(球体)实现了我的,但我们还必须将行星的轴绘制为上下线。

我发现使用 GL_LINES 似乎不起作用,大概是因为这个项目的规模(行星的半径是 139000000+)。

简化示例:

void drawAxis(int n)
{
  /* Draws the axis for body "n" */
  glColor3f(1.0,0.0,0.0);
  glBegin(GL_LINES);
    glVertex3f(0, bodies[n].radius, 0);
    glVertex3f(0, bodies[n].radius*2, 0);
  glEnd();

  glColor3f(0.0,1.0,0.0);
  glBegin(GL_LINES);
    glVertex3f(0, -bodies[n].radius, 0);
    glVertex3f(0, -bodies[n].radius*2, 0);
  glEnd();
}

void drawBody(int n)
{

  if(n==0) {
    /* Draws body "n" */
    //glRotatef(bodies[n].axis_tilt, 1.0, 0.0, 0.0);

    //Scale and position
    glTranslatef(0.0, 0.0, 0.0);
    glScalef(SCALE,SCALE,SCALE); //why already scaled? 

    //Axis
    drawAxis(n);   

    //r g b - colour (red, green, blue)
    glColor3f(bodies[n].r,bodies[n].g,bodies[n].b);

    //radius - size of body (km)
    glutSolidSphere (bodies[n].radius/SCALE, 50, 50);   
  }
}

抽奖:

我在这里遗漏了什么重要的东西吗?

在这个球体上绘制轴的最佳“解决方法”是什么?

【问题讨论】:

  • "行星的半径是 139000000+" 为什么?为什么行星的半径不是1.39?比例是 OpenGL 是 想要的。它不是米、厘米、英尺、英里、公里或其他什么。这正是你想要的。所以选择你的体重秤,让它对你来说最简单。
  • 我认为简单没关系,所以为了方便我的数据文件,将它保存在 KM
  • 您好 Pez,正如 Nicol 所说,秤导致了问题。正如您自己所说,这条线实际上并没有“宽度”,可以这么说,但这意味着当您尝试将数十万公里放入一个相机镜头时,您正在渲染无限小的东西。没有显示无限细的线并不奇怪;)
  • Pez,你有没有试过在画轴之前调用 glLineWidth() ?你可以传入一些更大的值,看看会发生什么。

标签: c opengl


【解决方案1】:
glScalef(SCALE,SCALE,SCALE); //why already scaled? 

...

glutSolidSphere (bodies[n].radius/SCALE, 50, 50);   

这毫无意义。为什么要应用统一的比例,然后将球体的比例除以它,从而取消比例?完全没有规模而只使用bodies[n].radius 不是更有意义吗?

这是您问题的根源。看,您在绘制球体时撤消了不必要的比例,但在绘制轴时撤消了它。如果您取出不必要的秤,它更有可能起作用。

【讨论】:

  • 这并不能解释为什么轴肯定不存在?在我意识到这条线不会受到比例的影响之前,我试图缩放(因为它只是两点)
  • 删除它似乎并没有改变问题,但感谢您的想法
  • @PezCuckow:是的,它有所作为。因为你没有在你的轴上做那个反刻度,所以它们不会位于球体的表面上。要么只使用具有单位半径的 glScale,要么不使用 glScale 但将比例应用于几何数据。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多