Перенос сферы по координатам 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, как всё рушится: Прошу объяснить, что я делаю неправильно. Возможно, нужен какой-то более универсальный метод?


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