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;
小数位存储正确,我将它们添加到旋转值但它仍无效。
答案 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。它具有更好的本地化,因此您无需更改“。”到“,”