![]() |
Модераторы: Partizan, gambit |
![]() ![]() ![]() |
|
gfmail |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 80 Регистрация: 8.7.2006 Репутация: нет Всего: нет |
Задача стоит такая: нарисовать 3d примитив(например куб), без использование directx, opengl и подобных. В принципе, часть этого уже реализована(куб рисуется и вращется), но сделать удаление скрытых линий(или закраску), не могу уже почти неделю. Искал много где, но везде или код без удаления невидимых линий, или алгоритм их удаления. Может кто-то реализовывал этот алгоритм? Пожалуйста, подскажите, где можно найти пример кода на С#(желательно).
|
|||
|
||||
mr.DUDA |
|
|||
![]() 3D-маньяк ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 8244 Регистрация: 27.7.2003 Где: город-герой Минск Репутация: 110 Всего: 232 |
Могу посоветовать следующее, пока без примера (т.к. ваших функций отрисовки у меня нет): создаём массив флоатов NxN (по размеру области куда рисуем), изначально содержащий float.MaxValue. Далее, рисуя полигон, проверяем каждую точку полигона на значение в массиве по координатам точки на экране: если у точки полигона координата Z (в нашем случае это глубина) меньше или равна значению в массиве - значит точка видима. Иначе нет. Если точка оказывается видима, записываем в массив её глубину. И так далее.
В современной 3D-графике этот алгоритм реализован аппаратно и называется z-buffer (или w-buffer, в случае float-формата). Программная эмуляция будет тормозить, т.к. нужно вручную отрисовывать каждую точку полигона. Другой вариант -- сортировка полигонов, так чтобы перекрывающиеся более дальние полигоны отрисовывать первыми. Нетривиальная задача, с ходу идей нет. -------------------- ![]() |
|||
|
||||
gfmail |
|
||||
Шустрый ![]() Профиль Группа: Участник Сообщений: 80 Регистрация: 8.7.2006 Репутация: нет Всего: нет |
Проблема в том, что рисую я не отдельно каждую точку, а линиями рисую каркас.
Вот код проецирования координат на экран. (в данном случае - фигура это 3д буква с 16 углами)
После этого фигура рисуется соединияя линиями спроецированные точки.(думаю из-за этого алгоритма прорисовки не могу прикрутить удаление невидимых линий, но как сделать по-другому не знаю).
|
||||
|
|||||
mr.DUDA |
|
|||
![]() 3D-маньяк ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 8244 Регистрация: 27.7.2003 Где: город-герой Минск Репутация: 110 Всего: 232 |
Если рисуется по линиям - помочь не могу.
-------------------- ![]() |
|||
|
||||
gfmail |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 80 Регистрация: 8.7.2006 Репутация: нет Всего: нет |
Да алгоритм прорисовки не важен, если знаете другой, такой же простой, то подскажите пожалуйста. Я пробовал рисовать плоскостями(по спроецированным координатам, с помощью FillPolygon), вроде неплохо получается, но по какому принципе эти плоскости сортировать по приоритету прорисовки? Сравнивать по центральное точке плоскости?
|
|||
|
||||
mr.DUDA |
|
|||
![]() 3D-маньяк ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 8244 Регистрация: 27.7.2003 Где: город-герой Минск Репутация: 110 Всего: 232 |
Алгоритм важен. Если бы рисовали по пикселам, реализация была бы тривиальная. По плоскостям - можно сортировать по ближайшей точке (но тогда не учитываются пересечения полигонов, если они есть). По линиям - вообще не в курсе, но даже на zx-спектруме был какой-то алгоритм в своё время, так что в гугле можно попробовать поискать по hidden line removal.
-------------------- ![]() |
|||
|
||||
gfmail |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 80 Регистрация: 8.7.2006 Репутация: нет Всего: нет |
Алгоритм важен, я имел ввиду что мне не важно каким алгоритмом рисовать, т.е. я бы мог и по точкам рисовать. А вот сортировать по ближайшей точке это то, что нужно, пока не пробовал, но кажется, это подойдет, т.к. пересечений не планируется. Большое спасибо за ответы
![]() |
|||
|
||||
![]() ![]() ![]() |
Прежде чем создать тему, посмотрите сюда: | |
|
Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов. Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :) Так же не забывайте отмечать свой вопрос решенным, если он таковым является :) Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle. |
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Общие вопросы по .NET и C# | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |