![]() |
Модераторы: Rickert, Alexeis, BorisVorontsov |
![]() ![]() ![]() |
|
SkIv1989 |
|
|||
Новичок Профиль Группа: Участник Сообщений: 20 Регистрация: 23.3.2009 Репутация: нет Всего: нет |
Всем привет, делаю тут курсовую, сделал машинку в максе, сделал экспорт в 3ds, когда загружаю в OpenGL, то получается не совсем то что нужно (см. аттач). Как видно там не сглаженная поверхность все кубиками, я так понимаю это из-за того, что мои нормали считаются для всех вершин, а нужно еще как-то учитывать группы сглаживания информация о которых хранится в чанке 4150, не подскажете как посчитать нормали с учетом этих групп?
Присоединённый файл ( Кол-во скачиваний: 62 ) ![]() |
|||
|
||||
Alexeis |
|
|||
![]() Амеба ![]() Профиль Группа: Админ Сообщений: 11743 Регистрация: 12.10.2005 Где: Зеленоград Репутация: 5 Всего: 459 |
Похоже на то что нормали совсем неправильно считаются.
-------------------- Vit вечная память. Обсуждение действий администрации форума производятся только в этом форуме гениальность идеи состоит в том, что ее невозможно придумать |
|||
|
||||
SkIv1989 |
|
|||
Новичок Профиль Группа: Участник Сообщений: 20 Регистрация: 23.3.2009 Репутация: нет Всего: нет |
сделал экспорт в *.obj (там информация о нормалях хранится) результат чуток получше, но всеравно все квадратиками:
Присоединённый файл ( Кол-во скачиваний: 50 ) ![]() |
|||
|
||||
Rickert |
|
|||
![]() Ситхи не пройдут! ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3356 Регистрация: 11.7.2006 Где: Лакрима Репутация: 2 Всего: 52 |
Неверные значения нормалей. Напишите код, который их будет выводить, чтобы оценить ошибку.
-------------------- Ни что не внушает сна крепче, чем день приисполненный трудов! |
|||
|
||||
SkIv1989 |
|
|||
Новичок Профиль Группа: Участник Сообщений: 20 Регистрация: 23.3.2009 Репутация: нет Всего: нет |
||||
|
||||
Rickert |
|
|||
![]() Ситхи не пройдут! ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3356 Регистрация: 11.7.2006 Где: Лакрима Репутация: 2 Всего: 52 |
Как мы можем оценить: нормали просчитаны верно. А значит ошибка в том, что изначально была одна нормаль для одной вершины, а теперь у вас вершин больше, а нормали новым вершинам не назначены. Как это может быть? Представим два треугольника, имеющие две общие вершины.
Всего получается 4 точки, если работать через индексы. А теперь разобьем эти треугольники на два независимых: получится что у нас уже не 4 вершины, а 6: и нормали теперь нужны для 6, а не 4. Т.е. те что были + 2 те что стали принадлежать каждому треугольнику в отдельности. Они конечно будут одинаковыми, но скорее всего ваша ошибка в том что вы их просто не назначили. -------------------- Ни что не внушает сна крепче, чем день приисполненный трудов! |
|||
|
||||
SkIv1989 |
|
|||
Новичок Профиль Группа: Участник Сообщений: 20 Регистрация: 23.3.2009 Репутация: нет Всего: нет |
ура, спасибо Rickert, теперь осталось разобраться с группами сглаживания, буду благодарен если кто-нибудь подкинет информацию как с ними работать:
Присоединённый файл ( Кол-во скачиваний: 66 ) ![]() |
|||
|
||||
shuttle |
|
|||
Бывалый ![]() Профиль Группа: Участник Сообщений: 230 Регистрация: 9.4.2008 Репутация: нет Всего: нет |
Может там просто нормали в противоположную сторону смотрели
--------------------
|
|||
|
||||
gorby |
|
|||
Новичок Профиль Группа: Участник Сообщений: 32 Регистрация: 27.3.2008 Где: Киев Репутация: нет Всего: нет |
Представьте себе куб.
В виде меша он будет иметь 6 граней. Каждая грань представлена 2-мя треугольниками. Так вот сглаживать нужно только те треугольники, что принадлежат одной грани. Они и будут в одной группе сглаживания. |
|||
|
||||
Rickert |
|
|||
![]() Ситхи не пройдут! ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3356 Регистрация: 11.7.2006 Где: Лакрима Репутация: 2 Всего: 52 |
Я никогда не слышал про группы сглаживания. Про просто сглаживание нормалей - это дело известное. Мы берём значение нормали вершины и делим на количество треугольников, которым она принадлежит.
-------------------- Ни что не внушает сна крепче, чем день приисполненный трудов! |
|||
|
||||
Shtorm |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 46 Регистрация: 23.2.2009 Где: Таганрог Репутация: нет Всего: 1 |
Было б хорошо если примерчик свой выложил, я бы хоть понял как сглаживание победить, а то сколько не читаю, наверное всё между строк. Так же читаю из 3ds файла данные, знаю как отрисовывать, посчитать нормали тоже могу и всё бы хорошо, но как сглаживание то сделать, а то у меня всё как-то не выходит. Нормали стандартно вычисляю по масиву Vertex. Картинка в атаче.
Присоединённый файл ( Кол-во скачиваний: 37 ) ![]() |
|||
|
||||
Merlin_ua |
|
|||
Новичок Профиль Группа: Участник Сообщений: 44 Регистрация: 22.11.2006 Репутация: нет Всего: нет |
SkIv1989
А можно поподробней как ты нормали рассчитывал? Я как-то в свое время искал подходящий алгоритм для расчета нормалей (кстати, использовал тоже импорт в 3ds), ничего подходящего не нашол. Все трвердят, что нормали нужно экспортить. Shtorm Может поможет. Насколько я разобрался в том, как происходит экспорт в 3ds, у меня сложилось следующее впечатление: нормали вершин принадлежащих ребру грани где используется сглаживание усредняются. Там где сглаживание не используется - нормали перпендикулярны фейсам. Если вершина принадлежит разным фейсам, и нужна нормаль для каждого фейса - такая вершина дублируеся. Поэтому нужно прогонять все вершины и проверять с помощью индексов скольким фейсам принадлежит вершина. Если вершина принадлежит только одному фейсу - нормаль будет перпендикулярна фейсу. Если вершина принадлежит нескольким фейсам - расчитывается усредненная нормаль. |
|||
|
||||
Shtorm |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 46 Регистрация: 23.2.2009 Где: Таганрог Репутация: нет Всего: 1 |
Я подумаю над тем что ты предложил. Может чего придумаю. Вообще нормали в формат *.ASE экспортятся, при экспорте галочку только ставить надо. Но 3ds меньше на много весит, чем ASE? скорее всего связано с тем, что экспорт происходит как есть всего, ну кроме конечно текстур, для текстур портится путь к ней. Посмотри может что накопаешь полезного, ASE это обычный текстовый файл.
Посмотреть хотелось бы на код, кто как отрисовывает с использованием групп сглаживания при использование 3ds файла.... Ну или реализованый примерчик, что тут разгребали, хорошая помощь бы была тем кто только начинает заниматься подобными вещами, что б лишних тем не генерили. |
|||
|
||||
BlackCrow |
|
|||
Новичок Профиль Группа: Участник Сообщений: 8 Регистрация: 12.3.2010 Репутация: нет Всего: нет |
Merlin_ua дак а чего там считать берешь вершину, берешь попарно ребра и считаешь векторное произведение, помоему так. Потом все нормали которые принадлежат одной вершине "усредняешь" как писал выше Rekert
Rikert, группы сглаживания это такая штука, которая используется для создания ребер, т.е. есть у тебя шар и надо тебе что бы на экваторе было ребро, назначаешь двум полушариям различные группы сглаживания и тогда для каждой точки на экваторе будет по две нормали, вроде так. Это сообщение отредактировал(а) BlackCrow - 24.1.2011, 18:18 |
|||
|
||||
Merlin_ua |
|
|||
Новичок Профиль Группа: Участник Сообщений: 44 Регистрация: 22.11.2006 Репутация: нет Всего: нет |
Оно то так, но мне интересна сама реализация. И во еще: нужно еще учитывать и группы сглаживания. Может возникнуть такая ситуация: два ребра на двух разных фейсах имеют разные вершины но с одинаковыми координатами. Группа сглаживания у ребер она!!! |
|||
|
||||
![]() ![]() ![]() |
Вы можете найти полезным что... | |
|
|
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Мультимедия, OpenGL/DirectX | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |