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

Вход на сайт

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

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

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

Очень интересно! ии сайт крутой жалко что умирает(
У Вас число превысит максимальное число int. Можно использовать в Вашем случае uint, но лучше все переписать на double.
Добавление к программе строки glutReshapeFunc(changeSize); приводит к тому, что треугольник перестаёт совсем отрисовываться.
Выдаёт ошибку glut32.dll не найден! При том, что он лежит в System32! Всё решил) Нужно отправить не в System32, а в System.
Спасибо за статью. Я не Ваш студент. Но мне она помогла написать функцию для Канторова множества на Python для черепашки: import turtle def kanter(x, y, d):     if d > 1:         turtle...

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

Рейтинг@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, то данная грань проецируется на экран.
На выходе работы программы получаем такое изображение: