Трассировка лучей

Подскажите пожалуйста, что не так? Ниже я привёл часть кода (C++), рисую окно используя winapi и устанавливаю цвет конкретного пикселя. Пытаюсь сделать 3D. По идеи должен получится куб, но происходит что-то странное. Если необходимо могу привести полный код.

Идея заключается в том, что известны координаты камеры, в данном примере 0, 0, 0. Экран FOV 70 по оси X и 50 по Y делится на 1280х720 соответственно. Получаются градусы на которые происходит смещение для каждого пикселя. Зная градус по X и Y и координаты первой точки отрезка нахожу координаты второй точки отрезка. Длинна отрезка меняется до дальности прорисовки. В данной ситуации ось X должна определять отдаление объекта, ось Y смещение объекта вправо-влево и ось Z по высоте. Но когда меняется координата объекта в условиях на единичку, то рисуется что-то странное.

while (true)  //бесконечный цикл
    {
        AngleY = 0;
        AngleX = 0;
        for (int j = 0; j < 720; j++)
        {
            AngleX = 0;
            AngleY = AngleY + delta_angleY;
            for (int i = 0; i < 1280; i++)
            {
                AngleX = AngleX + delta_angleX;

                for (int l = 0; l < 100; l++)
                {
                    X = l * cos(AngleX * 3.14 / 180) * sin(AngleY * 3.14 / 180);
                    Y = l * sin(AngleX * 3.14 / 180) * sin(AngleY * 3.14 / 180);
                    Z = l * cos(AngleY * 3.14 / 180);

                    //X = camX + X;
                    //Z = camY + Y;
                    //Y = camZ + Z;

                    if (X == 1)
                    {
                        if (Y == 1)
                        {
                            if (Z == 4)
                            {
                                SetPixel(hdcMem, i, j, RGB(255, 0, 0));
                            }
                        }
                    }
                }
            }
        }
        Sleep(1000 / 60);
        // Отображаем буфер на экране 
        BitBlt(hdc, 0, 0, Window_Width, Window_Height, hdcMem, 0, 0, SRCCOPY);
    }
    

X, Y, Z, - int, использую для округления, не хочу использовать числа с запятой, считаю проще уменьшить единицы измерения.

Вот формула, по которой высчитывал:

x2 = x1 + l * cos(a) * sin(b)

y2 = y1 + l * sin(a) * sin(b)

z2 = z1 + l * cos(b)

где:

  • x1, y1, z1 - координаты первой точки отрезка;
  • l - длина отрезка;
  • a - угол между проекцией отрезка на плоскость XY и осью X;
  • b - угол между отрезком и плоскостью XY.

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