Hide Rubik's Cube Внутренние проводки

В контексте приложения Java/OpenGL я рисую большой черный проводной (без заливки) большой куб, состоящий из 27 меньших кубов. Для этого я написал следующий код:

for (int x = 1; x <= 3; x++) {
    for (int y = 1; y <= 3; y++) {
        for (int z = 1; z <= 3; z++) {
            wireCube(x - 2, 2 - y, 2 - z);
         }
    }
}

wireCube метод реализован с использованием GL11.glBegin(GL11.GL_LINE_LOOP);

Используя правильный вызов gluPerspective определить проекцию и правильный вызов gluLookAt чтобы позиционировать "камеру", я могу отображать свой большой куб по мере необходимости и.... я очень доволен этим!!!

Моя новая проблема заключается в том, как изменить этот код, чтобы "спрятать" все проводки внутри большого куба? Чтобы помочь визуализировать сцену, эти проводки обычно нарисованы пунктирными линиями при изучении 3D геометрии в школе.

Заранее спасибо за помощь

Manu

3 ответа

Решение

Включить проверку глубины (glEnable(GL_DEPTH_TEST)) и положить квады на поверхности кубов.

Чтобы нарисовать квад, используйте glBegin(GL_QUADS) затем следуют четыре вершины и glEnd() вызов.

Нарисуйте все свои кубики с черными полигонами (или отключите вывод цвета: glColorMask(false,false,false,false);): это заполнит буфер глубины.

Затем нарисуйте свои линии. Те, что скрыты полигонами, не появятся. Будут z-бои, так что glDepthTest(GL_LEQUAL);

Если вы хотите нарисовать "невидимые" пунктирные линии, этого будет недостаточно. Вы можете нарисовать снова с glDepthTest(GL_GREATER);

Другое решение - нарисовать многоугольники, которые обращены к камере сплошной линией, а другие - пунктирной линией. Это простой точечный продукт (camDir.faceNorm).

Используйте glPolygonOffset(), чтобы утопить или отобразить ваш каркас над (или под) полигонами с одинаковыми координатами.

Другие вопросы по тегам