Трассировка лучей
Подскажите пожалуйста, что не так? Ниже я привёл часть кода (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.