Уроки, алгоритмы, программы, примеры

Материалы по разделам

Построения
на плоскости (2D)
Графика
в пространстве (3D)
Вычислительная
геометрия
Физическое
моделирование
Фрактальная
графика

Новые комментарии

У меня проблема вот с этим: gl.Clear(OpenGL.GL_COLOR_BUFFER_BIT | OpenGL.GL_DEPTH_BUFFER_BIT);. Вылезает ошибка: CS1061 "object" не содержит определения "GL_COLOR_BUFFER_BIT", и не удалось найти доступный метод расширения "GL_COLOR_BUFFER_BIT",...
Большое спасибо. Единственный код который прошел без каких либо ошибок. Ура!!!
Скажите пожалуйста, подскажите алгоритм по которому по заданным точкам можно определить тип многогранника, скажем это куб или прямоугольный параллелепипед. Нашел теорию по этим фигурам: https://www.mat... https://www.mat... Акцентировать внимание...
Всем у кого не работает. файл wizard.script Ещё одно упоминание Glut32 в строке "if (!VerifyLibFile(dir_nomacro_lib, _T("glut32"), _T("GLUT's"))) return false;" меняем на "if (!VerifyLibFile(dir_nomacro_lib, _T("freeglut"), _T("GLUT's"))) return...
Не получается, емаё

Счетчики и рейтинг

Рейтинг@Mail.ru Яндекс.Метрика

В решении задачи удаления невидимых линий и поверхностей можно выделить два основных подхода:
Первый подход заключается в определении для каждого пикселя того объекта, который вдоль направления проектирования является ближайшим к нему. При этом работа ведется в пространстве картинной плоскости и существенно используются растровые свойства дисплея.
Второй подход заключается в непосредственном сравнении объектов друг с другом для выяснения того, какие части объекта будут являться видимыми. В данном случае работа ведется в исходном пространстве объектов и никак не привязана к растровым характеристикам дисплея.
Алгоритм удаления невидимых граней выпуклого многогранника работает в пространстве объекта, то есть мы ищем и удаляем невидимые грани перед тем, как спроецировать объект на экран.
Пусть наш многогранник задан множеством точек. Нам нужны будут следующие математические приемы:
1) Векторное произведение векторов AB и BC нужно для нахождения нормали к грани, а именно его свойство ортогональности исходным векторам. Его формула:
(ay*bz-az*by)*i + (az*bx-ax*bz)*j + (ax*by-ay*bx)*k
Получаем вектор нормали n.

2) Скалярное произведение, которым мы будем проверять углы между векторами, нужно, во-первых, для определения направления вектора нормали(чтобы он был направлен "наружу"),
а во-вторых для определения угла между вектором камеры и вектором нормали. А именно нас будет интересовать знак скалярного произведения. Его формула:
ax*bx+ay*by
На рисунке ниже: в случае (1) произведение со знаком "плюс", в случае (2) произведение равно 0, в случае (3) произведение со знаком "минус",

Алгоритм состоит в следующем:
1) Сначала находим точку, расположенную внутри многогранника. Это можно сделать, например, таким образом:
1а) Находим центроиды всех граней, покоординатно суммируя каждую из точек, задающих эту грань, затем так же, по координатам делим получившиеся суммы на количество точек. Получаем точку - центр грани.
1б) Аналогично суммируем центры и делим их на количество граней
2) Для каждой грани ищем вектор нормали, это можно сделать через векторное произведение векторов, образованных тремя соседними точками грани.
3) Для каждой грани считаем скалярное произведение вектора, направленного из центра многогранника к центру грани, и вектора нормали этой грани. Если произведение <0, то домножаем компоненты вектора нормали на -1, чтобы он смотрел "наружу" многогранника.
4) При отрисовке для каждой грани проверяем скалярное произведение его и вектора, направленного от центра данной грани до точки наблюдения(для перспективной проекции это (0,0,-K), где К - расстояние от начала координат до точки наблюдения). Если скалярное произведение >0, то данная грань проецируется на экран.
На выходе работы программы получаем такое изображение: