如何将世界坐标系的自然单位转换为opengl单位?

时间:2019-08-25 22:53:19

标签: c++ c opengl

我正在构建物理引擎,因此,我也在学习opengl以便能够可视化物理引擎正在做什么。我想知道如何将自然单位(例如1米,1英寸等)转换为opengl单位。

我已经做过一些研究,似乎opengl单元并未真正定义。这是否意味着我可以将数字0.01f映射为等于1 cm。因此,如果我有一个以cx和cy为中心的圆,并且希望它下降1厘米,那么我可以执行以下操作吗?

float cx = 0.05f;
float cy = 0.05f;
cy -= .01;     

以下是到目前为止这些图形的玩具代码的一些片段:

void drawCircle() {
  float r = 0.05;
  int num_segments = 1000;

  glClearColor(0,0,0,0);
  glClear(GL_COLOR_BUFFER_BIT);

  glColor3f(1.0,1.0,1.0);

  glBegin(GL_LINE_LOOP);

  float thetaStep = 2.0f*M_PI/num_segments;
  for(float theta = 0; theta < 2.0f*M_PI; theta += thetaStep) {
    float x = r * cosf(theta);
    float y = r * sinf(theta);

    glVertex2f(x+cx, y+cy);
  }

 glEnd();
 glFlush();
}

GLvoid Timer(int value) {
  cy -= 0.01;
  if(value) {
    glutPostRedisplay();
  }

  glutTimerFunc(30, Timer, value);
}

以上代码段有效。它将以0.01 opengl单位的恒定速率向下移动球。

2 个答案:

答案 0 :(得分:2)

由于opengl坐标系在值-1和1之间,因此似乎正确的方法是缩放。如果我希望世界在300米的范围内,那么它将变为-300至300。要转换为opengl坐标,只需将自然坐标除以缩放器即可。例如,如果我在世界坐标系中的位置<0,100m>处有一个圆,则可以通过将每个分量除以300来转换为opengl坐标系。那就是假设opengl坐标系的尺度是300米。这将导致opengl坐标<0,.3333>。

答案 1 :(得分:2)

您使用的单位完全取决于您。如果要将1单位视为米,英寸或毫米,这完全取决于您。如果一切都按比例缩放,那么它对OpenGL不会有任何影响,因此请选择对您的物理引擎有意义的单位并使用它们(这样就可以避免不断转换单位)。

唯一要考虑的是,您的单位是否可以容纳浮子,或者是否需要回落到两倍以获取位置值。例如,如果使用浮子作为位置,并假设1 GL单位= 1米,则在距原点约25公里处的毫米精度将用光。

关于OpenGL的范围是-1和1,这是完全错误的。一旦将其转换为屏幕空间,即为值的范围。无论是在-FLT_MAX和+ FLT_MAX之间缩放还是在-10到+10的范围内缩放,都没有任何区别。您将获得完全相同的结果。