не получается избавится от рыбьего глаза в raycasting

недавно я захотел сделать игру на подобии doom. создать графику по алгоритму ray casting у меня получилось. но вот избавится от эффекта рыбьего глаза не получилось. я не знаю, может быть я плохо изучил эту тему, может быть что-то ещё, но при домножении расстояния на косинус рыбий глаз только инвертируется (или как это можно назвать). вот так выглядит стена с домноженем на cos(player.angle - rayAngle) в качестве вывода графики я использую sfml домножение на косинус

всё тоже самое, но без домножения без домножения на косинус

#define pi 3.14159
#define numRay 600
#define screenSizeX 1200
#define screenSizeY 600
#define fov 120
const float dist = numRay / (2 * tanf(60 * pi / 180)) * 300;
...
window.clear();
for (float i = 0; i < numRay; i++) {
    float rayAngle = i / (numRay / fov) + player.angle - 60;
    float rayx = player.x;
    float rayy = player.y;
    float movex = cosf(rayAngle * pi / 180) * 0.01;
    float movey = sinf(rayAngle * pi / 180) * 0.01;

    for (int j = 1; j < 255; j++) {
        rayx += movex;
        rayy += movey;
        if (Map[(int)rayy][(int)rayx] != 0) {
            float floatX = rayx - (int)rayx,
                  floatY = rayy - (int)rayy; // то, насколько луч вошёл внутрь блока

            if (floatX - movex > 0 && (floatY - movey < 0 || floatY - movey > 1))
                line.sprite.setTextureRect(IntRect((Map[(int)rayy][(int)rayx] - 1) * 31 + floatX * 31, 0, 1, 31));
            else
                line.sprite.setTextureRect(IntRect((Map[(int)rayy][(int)rayx] - 1) * 31 + floatY * 31, 0, 1, 31));

            line.sprite.setSize(Vector2f(
                    screenSizeX / numRay,
                    dist / (j * cosf((player.angle - rayAngle) * pi / 180))
            );
            line.sprite.setPosition(i * (screenSizeX / numRay), screenSizeY / 2 - line.sprite.getSize().y / 2);

            int col = 255 - (j * j / 255);
            line.sprite.setFillColor(Color(col, col, col));

            window.draw(line.sprite);

            break;
        }
    }
}
window.display();

если я забыл что-то указать, прошу написать об этом


Ответы (1 шт):

Автор решения: Илья Шишкин

я решил эту проблему. она состояла в том, что я использовал градусы для обозначения размера поля зрения (fov). его нужно обозначить как pi / 3 и избавиться от лишних переводов в радианы (представлять всё в них изначально)

→ Ссылка