Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Алгоритмы > Додекаэдр с непрозрачными гранями


Автор: Ramzai 14.4.2005, 16:21
Построил додекаэдр, у к-рого 20 точек (x, y, z) - перемещается в пр-ве параллельным переносом и поворотом вокруг осей. Вопрос, как в каждый момент времени определить, какие ребра не рисовать. ИМХО что-то сложное вроде z-буфера здесь не надо, а есть что-то простое для частного случая. Заранее спасибо

Автор: Void 14.4.2005, 18:36
Додекаэдр рисуется проволочной моделью (только ребра) ? Тогда это можно сделать так: вычисляются нормали ко всем граням додекаэдра, затем определяется угол м/у нормалью каждой грани и лучом зрения наблюдателя. Если угол острый (т.е. скалярное произведение положительно), то соответствующая грань видима, если тупой (отрицательно) - то невидима. Дальше все просто - видимы те ребра, у которых хотя бы одна образующая их грань видима.

Автор: Ramzai 14.4.2005, 19:11
Да, проволочная модель. Каждая из 20 вершин - запись (x, y, z) + 3 указателя на индексы соседних вершин. Про параллельный перенос я погорячился, только поворот вокруг осей по формулам (для оси X):
Код

a[i].Y := y * cos(angle) - z * sin(angle); 
a[i].Z := z * cos(angle) + y * sin(angle); 

Вывод на экран - просто X, Y (в соотв. область).
Чем мне не нравится предложенное: вычисление нормали должно учитывать направление нормали, так? По трем точкам - помимо чисто математических формул нужны еще какие-то дополнительные управляющие конструкции, определяющие направление нормали. Луч зрения наблюдателя - вообще как-то себе слабо представляю (в моем случае по оси Z что-ли?)
В общем, нельзя как-нибудь использовать то, что центр додекаэдра - (0, 0, 0) и z-координаты вершин?
Заранее спасибо.

Автор: DENNN 15.4.2005, 13:06
Цитата(Ramzai @ 14.4.2005, 19:11)
вычисление нормали должно учитывать направление нормали, так

Несовсем. Порядок обхода вершин на всех гранях должен быть одинаквым. Т.е., к примеру, для каждой грани все вершины перечислятся по порядку против часов стрелки. ТОгда "ориентированную" нормаль к грани можно получить просто выполнив векторное произведение двух сосдених ребер.

Цитата(Ramzai @ 14.4.2005, 19:11)
В общем, нельзя как-нибудь использовать то, что центр додекаэдра - (0, 0, 0) и z-координаты вершин?

Если хочется изврата, то конечно. smile Например для каждой точки проверить тот факт, что как минимум 1/2 всех вершин имеют более маленькое значение Z. Но этот метод будет давать сбои.

Автор: maxim1000 15.4.2005, 19:10
Цитата
В общем, нельзя как-нибудь использовать то, что центр додекаэдра - (0, 0, 0) и z-координаты вершин?

можно и очень просто
берем просто среднее арифметическое всех вершин выбранной грани - получаем вектор
я точно не помню додекаэдра, вполне возможно, что это и будет нормаль
но в любом случае этот вектор будет идти наружу фигуры, а значит, нормаль можно выбрать такую, чтобы угол между ней и этим вектором был острый...

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)