Книги
чёрным по белому
Главное меню
Главная О нас Добавить материал Поиск по сайту Карта книг Карта сайта
Книги
Археология Архитектура Бизнес Биология Ветеринария Военная промышленность География Геология Гороскоп Дизайн Журналы Инженерия Информационные ресурсы Искусство История Компьютерная литература Криптология Кулинария Культура Лингвистика Математика Медицина Менеджмент Металлургия Минералогия Музыка Научная литература Нумизматика Образование Охота Педагогика Политика Промышленные производства Психология Путеводители Религия Рыбалка Садоводство Саморазвитие Семиотика Социология Спорт Столярное дело Строительство Техника Туризм Фантастика Физика Футурология Химия Художественная литература Экология Экономика Электроника Энергетика Этика Юриспруденция
Новые книги
Цуканов Б.И. "Время в психике человека" (Медицина)

Суворов С. "Танк Т-64. Первенец танков 2-го поколения " (Военная промышленность)

Нестеров В.А. "Основы проэктирования ракет класса воздух- воздух и авиационных катапульных установок для них" (Военная промышленность)

Фогль Б. "101 вопрос, который задала бы ваша кошка своему ветеринару если бы умела говорить" (Ветеринария)

Яблоков Н.П. "Криминалистика" (Юриспруденция)
Реклама

Windows presentation foundation with - MacDonald M.

MacDonald M. Windows presentation foundation with — Вильямс , 2008. — 928 c.
ISBN 978-5-8459-1429-3
Скачать (прямая ссылка): wpfwindowspresente2008.pdf
Предыдущая << 1 .. 391 392 393 394 395 396 < 397 > 398 399 400 401 402 403 .. 473 >> Следующая

на треугольники выглядит объект МезЬОеотеЪгуЗР, описывающий куб:
<MeshGeometry3D Positions= '0 0 0 10,0,0 0 ,10, 0 10 ,10,0
0 0 10 10,0,10 0 ,10, 10 10 ,10,10
TriangleIndices= '0 2 1 1,2,3 0, 4,2 2, 4, 6
0 1, 4 1,5,4 1, 7,5 1, 3, 7
4 5, 6 7,6,5 2, 6,3 3, 6, 7" />
Коллекция Positions определяет углы куба. Она начинается с четырех точек задней стороны (где z = 0), а затем добавляет четыре точки передней стороны (где z = 10). Свойство TriangleIndices отображает эти точки на треугольники. Например, первый элемент в этой коллекции — 0, 2, 1. Он описывает треугольник от первой точки (0,0,0) до второй (0,0,10) и третьей (0,10,0). Это — один из двух треугольников, формирующих заднюю грань куба (индекс 1, 2, 3 описывает второй треугольник задней грани).
Напомним, что при определении треугольников вы должны определять их в направлении против часовой стрелки, чтобы их лицевая сторона смотрела вперед. Однако куб нарушает это правило. Квадраты передней стороны определяются в порядке против часовой стрелки (см. индексы 4, 5, 6 и 7, 6, 5), но поверхность задней стороны описана по часовой стрелке, включая индексы 0, 2, 1 и 1, 2, 3. Это объясняется тем, что обратная сторона куба должна обращать свою лицевую сторону назад. Чтобы лучше представить это, предположим, что наш куб будет вращаться вокруг оси Y, так что обратная сторона переместится вперед. Теперь те треугольники, которые смотрели назад, будут повернуты вперед, что сделает их полностью видимыми, и мы получим именно то поведение, которое нужно.
Затенение и нормали
Есть еще одна проблема, связанная с сеткой куба, продемонстрированной в предыдущем разделе. Дело в том, что она не создает четко ограненного куба, показанного на рис. 23.8. Вместо этого вы получите куб, показанный на рис. 23.10, с явно видимыми стыками между треугольниками.
Эта проблема возникает из-за способа, каким WPF вычисляет освещение. Для того чтобы упростить процесс вычислений WPF находит уровень освещенности каждой вершины фигура; другими словами, внимание уделяется только углам треугольников, а их поверхности заполняются переходными цветами. Хотя это обеспечивает приятную штриховку каждого треугольника, но может стать причиной появления других артефактов. Например, в этой ситуации это мешает равномерному окрашиванию двух треугольников, образующих сторону куба.
Чтобы понять, почему так происходит, вам нужно немного узнать о нормалях. Каждая нормаль определяет, как вершина ориентирована относительно источника света. В большинстве случаев необходимо, чтобы нормаль была перпендикулярна поверхности вашего треугольника.
Book_Pro_WPF-2.mdb 774 19.05.2008 1
1:11:27
Трехмерная графика 775
Рис. 23.10. Куб с артефактами освещенности
На рис. 23.11 эта концепция иллюстрируется на примере передней поверхности куба. Передняя поверхность состоит из двух треугольников и всего четырех вершин. Каждая из этих четырех вершин должна иметь нормаль, направленную под прямым углом к поверхности квадрата. Другими словами, нормаль должна иметь направление (0,0,1).
Совет. Нормали можно представлять себе по-другому. Когда вектор нормали направлен противоположно вектору освещения, то поверхность будет освещена полностью. В данном примере это значит, что прямой свет, направленный в (0,0,-1), полностью осветит переднюю грань куба, т.е. вы получите то, чего ожидали.
Треугольники на других сторонах куба также должны иметь собственные нормали. В каждом случае нормали должны быть перпендикулярны поверхности. На рис. 23.12 показаны нормали на передней, верхней и правой гранях куба.
Куб на рис. 23.12 — это тот же самый куб, что и показанный на рис. 23.8. Когда WPF затеняет куб, то просматривает каждый треугольник по одному.
*
Рис. 23.11. Нормали передней стороны куба
Рис. 23.12. Нормали на видимых сторонах куба
Book_Pro_WPF-2.mdb 775
19.05.2008 18:11:27
776 Глава 23
0, 0 0, 0, 10 0, 10, 0 0, 10, 10
0,0 10,0,0 0,0,10 10,0,10
Например, возьмем переднюю поверхность. Каждая точка встречает направленный свет одинаково. По этой причине каждая точка будет освещена одинаково. В результате, когда WPF распределяет освещенность на четыре угла, то создаст плоскую, равномерно окрашенную поверхность без затенения.
Так почему же созданный нами куб ведет себя подобным образом? Виноваты общие точки в коллекции Positions. Хотя нормали определяют затенение треугольников, но определены они только в вершинах треугольника. Каждая точка в коллекции Positions имеет только одну нормаль, определенную для нее. Это означает, что если вы разделяете одни и те же точки между разными треугольниками, то также вы разделяете и их общие нормали.
Именно это произошло на рис. 23.10. Разные точки одной и той же стороны освещены по-разному, потому что они имеют разные нормали. А WPF сглаживает освещенность между этими точками, заполняя поверхность каждого треугольника. Это разумное поведение по умолчанию, но поскольку сглаживание выполняется для каждого треугольника, разные треугольники по освещенности не совпадают точно, в результате чего мы наблюдаем “стыки” цвета между ними.
Предыдущая << 1 .. 391 392 393 394 395 396 < 397 > 398 399 400 401 402 403 .. 473 >> Следующая