Вопрос ротации OpenGL - PullRequest
       4

Вопрос ротации OpenGL

1 голос
/ 29 декабря 2011

Решение:

strtod вместо atof решило это.Спасибо!

TODO: сделайте это ответом для принятия


Я загружаю значение из файла XML, который говорит, на сколько текстуру следует повернуть.

Это выглядит так:

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

В моем редакторе уровней текстуры вращаются правильно;пи равняется 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 = десятичные числа [0] / 10 + десятичные числа [1] /100 + десятичные дроби [2] / 1000 + десятичные дроби [3] / 10000 + десятичные дроби [4] / 100000 + десятичные дроби [5] / 1000000;

Десятичные дроби сохраняются правильно, и я добавляю их к значению поворота, ноэто все еще не помогает.

Ответы [ 2 ]

1 голос
/ 29 декабря 2011

Прекратите это, убедитесь, что то, что вы думаете происходит действительно происходит:

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;

Используйте отладчик для выполнения каждой операции и убедитесь, что значения соответствуют ожидаемым.

0 голосов
/ 30 декабря 2011

Вы можете использовать strtod вместо atof.У него лучшая локализация, поэтому вам не нужно менять «.»к ","

...