Конференция "Media" » Отсечение граней
 
  • dmk © (30.01.17 23:41) [0]
    Кто-нибудь занимался отсечением граней?
    Как, например, удалить грани у сферы?
    http://hostingkartinok.com/show-image.php?id=983e742f831810dcd078308eff5e3677

    Есть единый рецепт или надо свой придумывать?
  • Pavia © (31.01.17 05:59) [1]
    Какой у вас API?

    Для отсечения вычисляем нормаль к треугольнику если она смотрит на нас то рисуем если от нас то не рисуем. Во всяких там OpenGL и DirecX за это отвечает один флаг один битик.

    Рецепт не бывает один. Их много сейчас просто не вспомню других методов.

    Что касается удалить грани это просто нарисовать одни рёбра edge. Они рисуются линиям, просто соединяя точки. Опять таки способ вывода переключается одним флагом. Есть конечно свои тонкости.
  • Pavia © (31.01.17 07:37) [2]
    Отсечение glCullFace .
    https://www.khronos.org/opengl/wiki/Face_Culling

    Удаление glPolygonMode с GL_LINE.
    https://www.opengl.org/sdk/docs/man2/xhtml/glPolygonMode.xml
  • dmk © (31.01.17 12:28) [3]
    API свой. Обычная фронтальная проекция.
    Нужен алгоритм или направление как это примерно делается.
    OpenGL, DirectX не использую. API софтверный. Все вычисления для ЦП.

    Отсечь нужно ребра, т.е. линии.
  • dmk © (31.01.17 12:29) [4]
    Надо как в варианте Б: http://www.100byte.ru/stdntswrks/gl/gl17.png
  • dmk © (31.01.17 13:03) [5]
    Тормоза получаются, а еще текстуры не наложил :(
    http://hostingkartinok.com/show-image.php?id=58f191182f72667ece8fcc0d4fa3ca46
  • Pavia © (31.01.17 18:11) [6]
    Проверяем по часовой стрелки у нас рисуются рёбра или против. По часовой оставляем против отсекаем.
    Перебираем или вернее обходим рёбра треугольника.
    Берём первое ребро E1 и второе E2

    Е1.dy>0 - ребро идёт в верх.

    E1.dy>0 and E2.dy<0 то если E2.x2>E1.x1 то по часовой
    E1.dy>0 and E2.dy<0 то если E2.x2<E1.x1 то против часовой
    E1.dy>0 and E2.dy>0  то если E2.dx>E2.dy то по часовой
    E1.dy>0 and E2.dy>0  то если E2.dx<E2.dy то против часовой

    E1.dy<0 and E2.dy>0 то если E2.x2>E1.x1 то против часовой
    E1.dy<0 and E2.dy>0 то если E2.x2<E1.x1 то по часовой
    E1.dy<0 and E2.dy<0  то если E2.dx<-E2.dy то против часовой
    E1.dy<0 and E2.dy<0  то если E2.dx>-E2.dy то по часовой

    Или вот там и др алгоритмы отсечения:
    http://algolist.manual.ru/graphics/3dfaq/articles/31.php

    http://habrahabr.ru/post/248159/
  • dmk © (01.02.17 00:34) [7]
    Видимо к каждой вигуре индивидуальный подход нужен. Для сферы нормали можно отсечь, а для плоскостных фигур уже по другому.
  • Pavia © (01.02.17 05:49) [8]

    > Видимо к каждой вигуре индивидуальный подход нужен. Для
    > сферы нормали можно отсечь, а для плоскостных фигур уже
    > по другому.

    Вы вообще статьи читали? Где там про сферу написано? Это универсальные алгоритмы. Хотите чисто для сферы делаете отсечение по z.
  • dmk © (01.02.17 12:08) [9]
    >Вы вообще статьи читали? Где там про сферу написано? Это универсальные алгоритмы.
    Читал. Спасибо. Нужно нормаль высчитать для поверхности. Проблема в том, что у ребра 2 точки, а для вектора нужна третья, а она может быть только на соседней грани. Как просчитать нормаль для грани? 2 точки + соседняя (левая) треугольник - виден, а с правой уже не виден. Получается казус. На границе выкидывается грань, которая на самом деле видна и представляет собой видимую границу фигуры.
 
Конференция "Media" » Отсечение граней
Есть новые Нет новых   [118407   +10][b:0][p:0]