OpenGL轮换问题

时间:2011-12-29 00:24:08

标签: c++ opengl sdl rotation

解决方案:

strtod而不是atof解决了它。 谢谢!

TODO:将此作为接受的答案


我正在从XML文件加载一个值,该文件告诉我应该旋转多少纹理。

看起来像这样:

string rotv = ItemElem->FirstChild("Rotation")->FirstChild()->Value();
rotation = -(atof(rotv.c_str()))*57.2957795;

在我的关卡编辑器中,纹理正确旋转; pi等于180度,依此类推。 但在引擎中;它们不是,似乎小数被忽略了。因此,例如,应旋转3.14弧度的纹理仅旋转3弧度,依此类推。 我已经尝试了许多不同的方法来确保包含小数,但我无法让它起作用。

我像这样旋转纹理:

glBindTexture(GL_TEXTURE_2D, texture->GetImage());
glMatrixMode(GL_TEXTURE);

glLoadIdentity();
glTranslatef(0.5, 0.5, 0);
glRotatef(rotation, 0, 0, 1);
glTranslatef(-0.5, -0.5, 0);

glMatrixMode(GL_PROJECTION);

xml文件中的值使用点而不是昏迷,我将其转换为这样,我还单独存储小数,仅用于调试。

 for (int x = 0; x < rotv.size(); x++)
     {
          if (afterComa)
          {
                  int temp = (int) rotv[x] - '0';
              if (temp <10 && temp >= 0)
              {
                  decimals[decimalPos] = temp;
                  decimalPos++;
              }
              else
              {
                  break;
              }

          }
         if (rotv[x] == '.')
         {
             rotv[x] = ',';
             afterComa = true;
          }
      }

float decimalValue = decimals [0] / 10 + decimals [1] / 100 + decimals [2] / 1000 + decimals [3] / 10000 + decimals [4] / 100000 + decimals [5] / 1000000;

小数位存储正确,我将它们添加到旋转值但它仍无效。

2 个答案:

答案 0 :(得分:1)

将其分解,确保认为正在发生真正正在发生的事情:

string rot_str = ItemElem->FirstChild("Rotation")->FirstChild()->Value();
float rot_rad = atof( rotv.c_str() );
float rot_deg = rot_rad * 57.295779;
rotation = rot_deg;

使用调试器逐步执行每个操作并验证值是否符合预期。

答案 1 :(得分:0)

您可以使用strtod代替atof。它具有更好的本地化,因此您无需更改“。”到“,”