Некоторые странные вещи, происходящие с моими аффинными преобразованиями

Теперь я не спрашиваю как чтобы повернуть мой объект, я спрашиваю, почему мой объект (SDL_Surface) растягивается при вращении по формуле:

x ‘= cos (угол) * x — грех (угол) * y;
y ‘= грех (угол) * x + cos (угол) * y;

Теоретически (я полагаю) это правильно. Однако, когда я использую приведенный ниже код, в котором используется эта формула, я получаю это странное растяжение и переворачивание после того, как угол выйдет за пределы 15 градусов! Есть идеи, что вызывает это?

for (int y = -GAME_HEIGHT/2; y < GAME_HEIGHT/2; ++y) {
for (int x = -GAME_WIDTH/2; x < GAME_WIDTH/2; ++x) {
/*----------------Begin Mode7 FX-----------------*/
float px, py, pz;
px = x;
py = FOV;
pz = y - Xrot;

float sx, sy;
sx = x;
sy = y;//sx = px != 0 && pz != 0 ? px / pz : 0;
//sy = py != 0 && pz != 0 ? py / pz : 0;

sx = cos(Yrot*PI/180) * sx - sin(Yrot*PI/180) * sy;
sy = sin(Yrot*PI/180) * sx + cos(Yrot*PI/180) * sy;

sx *= scaling;
sy *= scaling;

sx = (sx / GAME_WIDTH * 0.5f + 0.5f) * BG0.image->w;
sy = (sy / GAME_HEIGHT * 0.5f + 0.5f) * BG0.image->h;

sx = (float)wrap((int)sx, 0, BG0.image->w);
sy = (float)wrap((int)sy, 0, BG0.image->h);

/*------------------End Mode7 FX-----------------*/
Uint32 grabPixel = getpixel(BG0.image, sx, sy);

SDL_PixelFormat* myPixelFormat=backBuffer->format;
putpixel(backBuffer, x+GAME_WIDTH/2, y+GAME_HEIGHT/2, grabPixel);
}
}

Пожалуйста, помогите, так как я действительно бился головой об стол с этим. Это единственный камень преткновения для получения идеального программного эффекта рендеринга mode-7, который я делаю (вот причина закомментированного перспективного преобразования)

РЕДАКТИРОВАТЬ: Решено, ниже ответ объясняет, как я облажался. (По сути, я случайно ввел неправильное значение для генерации координаты Y, и он использовал уже преобразованную координату X)

0

Решение

Когда вы делаете sx = …, а затем вы делаете sy = …, уравнение sy использует sx.

Я думаю, что вы должны сделать что-то вроде:

float ax = sx, ay = sy;
sx = cos(Yrot*PI/180) * ax - sin(Yrot*PI/180) * ay;
sy = sin(Yrot*PI/180) * ax + cos(Yrot*PI/180) * ay;
3

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector