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(), чтобы утопить или отобразить ваш каркас над (или под) полигонами с одинаковыми координатами.