Перенос сферы по координатам x и y
Я создаю сферы в opengl самым простым на мой взгляд способом - прохожусь вложенным циклом по координатам x, y внутри квадрата 2R x 2R и нахожу z исходя из x, y, радиуса шара, положения центра сферы. Это получается примерно по такой формуле: (x-x0)^2 + (y-y0)^2 + (z-z0)^2 = R^2 <=> z = ±√(R^2 - (x-x0)^2 - (y-y0)^2) + z0. Составляю из ближайших точек 4-хугольники и отрисовываю с учётом перспективы. Вот функция в моём коде, которая отвечает за рисование шара:
void display()
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glClearDepth(0);
glDepthFunc(GL_GREATER);
glLoadIdentity();
init_lighting();
for (double x = cx - R; x < cx + R; x += step)
{
double X1 = x - cx;
double X2 = X1 + step;
for (double y = cy - R; y < cy + R; y += step)
{
double Y1 = y - cy;
double Y2 = Y1 + step;
double D = Rsqr - X1 * X1 - Y1 * Y1;
if (D < 0) continue;
double z1 = cz + sqrt(D);
D = Rsqr - X2 * X2 - Y2 * Y2;
if (D < 0) continue;
double z3 = cz + sqrt(D);
D = Rsqr - X1 * X1 - Y2 * Y2;
if (D < 0) continue;
double z2 = cz + sqrt(D);
D = Rsqr - X2 * X2 - Y1 * Y1;
if (D < 0) continue;
double z4 = cz + sqrt(D);
double avg_z = (z1 + z2 + z3 + z4) / 4;
double Z = avg_z - cz;
glBegin(GL_QUADS);
glNormal3f(X1 + step / 2, Y1 + step / 2, Z);
glVertex3f(x, y, z1);
glVertex3f(x, y + step, z2);
glVertex3f(x + step, y + step, z3);
glVertex3f(x + step, y, z4);
glEnd();
}
}
glEnd();
glutSwapBuffers();
}
cx, cy, cz - координаты центра сферы, Rsqr = R*R, остальное, думаю, понятно. Всё работает прекрасно при нулевых x и y. Получается такой результат:
Но стоит только изменить cx или cy, как всё рушится:
Прошу объяснить, что я делаю неправильно. Возможно, нужен какой-то более универсальный метод?