C++ OpenGL旋转问题 解决方案:

C++ OpenGL旋转问题 解决方案:,c++,opengl,sdl,rotation,C++,Opengl,Sdl,Rotation,斯特罗德而不是阿托夫解决了这个问题。 谢谢 TODO:将此作为接受的答案 我正在从XML文件加载一个值,该值告诉纹理应该旋转多少 看起来是这样的: string rotv = ItemElem->FirstChild("Rotation")->FirstChild()->Value(); rotation = -(atof(rotv.c_str()))*57.2957795; glBindTexture(GL_TEXTURE_2D, texture->GetImage

斯特罗德而不是阿托夫解决了这个问题。 谢谢

TODO:将此作为接受的答案


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

看起来是这样的:

string rotv = ItemElem->FirstChild("Rotation")->FirstChild()->Value();
rotation = -(atof(rotv.c_str()))*57.2957795;
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);
在我的级别编辑器中,纹理正确旋转;π等于180度,以此类推。 但是在引擎里;它们不是,似乎小数被忽略了。例如,应该旋转3.14弧度的纹理仅旋转3弧度,以此类推。 我尝试了许多不同的方法来确保小数被包括在内,但我无法让它起作用

我像这样旋转纹理:

string rotv = ItemElem->FirstChild("Rotation")->FirstChild()->Value();
rotation = -(atof(rotv.c_str()))*57.2957795;
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文件中的值使用一个点而不是coma,我将其转换为这样,我还单独存储小数以进行调试

 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;
          }
      }
for(int x=0;x
浮点小数=小数[0]/10+小数[1]/100+小数[2]/1000+小数[3]/10000+小数[4]/100000+小数[5]/1000000


小数被正确存储,我将它们添加到旋转值中,但这仍然没有帮助。

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

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;

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

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

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;

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

您可以使用而不是atof。它具有更好的本地化功能,因此您不必将“.”改为“,”

您可以使用它来代替atof。它具有更好的本地化功能,因此您不必将“.”改为“,”

旋转的类型是什么
是否声明为
int
?XML中是否有区域设置信息以及小数点使用的字符是什么?旋转是一个浮点,XML使用一个点作为小数点。我在文章中更新了更多关于何时“转换”值的信息。您是否尝试过使用strod()。它具有更好的本地化功能,因此您不必将“.”更改为“,”,谢谢!它的工作原理类似于一个charm=)旋转的类型是什么?是否声明为
int
?XML中是否有区域设置信息以及小数点使用什么字符?旋转是一个浮点,XML使用一个点作为小数点。我在文章中更新了更多关于何时“转换”值的信息。您是否尝试过使用strod()。它具有更好的本地化功能,因此您不必将“.”更改为“,”,谢谢!它就像一个魅力=)嗨,谢谢你的回复。我这样做了,但是我的调试器不会显示值,我不知道为什么。@Orujimaru请检查项目是否在调试模式下运行以查看值。是的,它没有在调试模式下运行,我正在多台计算机之间移动解决方案,而我当前所在的计算机由于某些原因不支持我的调试设置。您好,谢谢回复。我这样做了,但是我的调试器不会显示值,我不知道为什么。@Orujimaru请检查项目是否在调试模式下运行以查看值。是的,它没有在调试模式下运行,我正在多台计算机之间移动解决方案,而我当前所在的计算机由于某种原因不支持我的调试设置。