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

Суворов С. "Танк Т-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 .. 392 393 394 395 396 397 < 398 > 399 400 401 402 403 404 .. 473 >> Следующая

Один простой (однако нудный) способ решения этой проблемы заключается в обеспечении того, чтобы ни одна точка не была разделена между разными треугольниками, а для этого объявлена несколько раз (по одному для каждого использования). Вот как будет выглядеть удлиненный код разметки, который обеспечит это:
<MeshGeometry3D Positions="0,0,0 10,0,0 0,10,0 10,10,0
0,
0,
10,0,0 10,10,10 10,0,10 10,10,0
,0,10 10,0,10 0,10,10 10,10,10
10,0 0,10,10 10,10,0 10,10,10"
2,1 1,2,3
,5,6 6,5,7
8,9,10 9,11,10
12,13,14 12,15,13
16,17,18 19,18,17
20,21,22 22,21,23" />
В этом примере такой шаг избавляет вас от необходимости кодировать нормали вручную. WPF корректно генерирует их, обеспечивая перпендикулярность каждой нормали к поверхности треугольника, как показано на рис. 23.11. В результате мы получим четко ограненный куб, изображенный на рис. 23.8.
На заметку! Хотя этот код разметки несколько длиннее, накладные расходы существенно не изменились. Это связано с тем, что WPF всегда выполняет визуализацию трехмерной сцены как коллекции различных треугольников, независимо от того, есть у них общие точки или нет в коллекции Positions.
Важно понимать, что вам не всегда понадобится обеспечивать такое соответствие нормалей. В примере с кубом это — необходимое требование, чтобы получить четкие грани. Однако вам может понадобиться и другой световой эффект. Например, вам может понадобиться сглаженный куб, который, однако, лишен недостатка, связанного со “стыками” цветов. В этом случае нужно явно определить векторы нормалей.
Выбор правильных нормалей может быть непрост. Чтобы получить нужный вам результат, памятуйте о следующих двух принципах.
• Для вычисления нормали, перпендикулярной поверхности, вычислите векторное произведение векторов, составляющих любые две стороны вашего треугольника. Однако не забудьте, что точки треугольника следует обходить в направлении против часовой стрелки, чтобы нормаль была направлена от поверхности (а не в нее).
0
0
TriangleIndices="0
4
Book_Pro_WPF-2.mdb 776
:11:27
Трехмерная графика 777
• Если вы хотите согласованного выравнивания освещенности по поверхности, включающей более одного треугольника, убедитесь, что все точки во всех треугольниках разделяют одну и ту же нормаль.
Для вычисления нормали, необходимой вашей поверхности, можете воспользоваться кодом C#. Ниже приведен пример кода процедуры, которая поможет вычислить нормаль, перпендикулярную поверхности треугольника, заданного координатами его вершин.
private Vector3D CalculateNormal(Point3D p0, Point3D p1, Point3D p2)
{
Vector3D v0 = new Vector3D(p1.X - p0.X, pl.Y - p0.Y, pl.Z - p0.Z);
Vector3D vl = new Vector3D(p2.X - pl.X, p2.Y - pl.Y, p2.Z - pl.Z); return Vector3D.CrossProduct(v0, vl);
}
Затем вы должны вручную установить свойство Normals, заполнив его векторами. Помните, что вы должны добавить по одной нормали к каждой позиции.
Следующий пример сглаживает цвета соседних треугольников, образующих общий прямоугольник, за счет разделения нормалей. Соседние треугольники на поверхности куба разделяют две общие точки. Поэтому нужно подкорректировать освещенность только тех двух точек, которые не являются общими. Пока они соответствуют друг другу, затенение будет согласовано по всей общей поверхности:
<MeshGeometry3D Positions= '0 ,0 ,0 l0 0 0 0, l0,0 l0,l0,0
0 0, l0 l0 ,0 l0 0, l0,l0 l0,l0,l0
TriangleIndices= 0, 2, l l 2, 3 0, 4 ,2 2,4 6
0 l, 4 l 5, 4 l, 7 ,5 l,3 7
4 5 6 7 6, 5 2, 6 ,3 3,6 7
Normals= 0, l, 0 0 l, 0 l, 0 ,0 l,0 0
0 l, 0 0 ,l, 0 l, 0 ,0 l,0 0 ' />
Это позволит создать сглаженный куб, показанный на рис. 23.13. Теперь значительные части куба разделяют одну и ту же нормаль. Это создает исключительно гладкий эффект, который совершенно скрывает стыки сторон куба, делая их почти неразличимыми.
Рис. 23.13. Исключительно гладкий куб
Book_Pro_WPF-2.mdb 777 19.05.2008 18:11:27
778 Глава 23
Данный эффект нельзя назвать корректным или некорректным — это зависит от того, какого эффекта вы хотите достичь. Например, четко выделенные грани создают более геометрический внешний вид, в то время как сглаженные стороны создают впечатление чего-то органического. Один часто применяемый трюк заключается в использовании сглаживания на многоугольнике, создавая впечатление сферы, цилиндра или другой криволинейной поверхности. Поскольку сглаживание скрывает грани фигуры, такой эффект работает исключительно хорошо.
Более сложные фигуры
Реалистические трехмерные сцены требуют использования сотен или тысяч треугольников. Например, один из возможных подходов к построению простой сферы заключается в разбиении сферы на плоские ленты с последующим разбиением каждой ленты на серию квадратов, как показано на рис. 23.14. Каждый из квадратов, в свою очередь, требует для своего отображения двух треугольников.
Рис. 23.14. Два способа моделирования базовой сферы
Чтобы построить такую нетривиальную сетку, вам понадобится сконструировать ее в коде или воспользоваться специализированной программой трехмерного моделирования. Подход на основе кода потребует серьезного математического аппарата (код построения сферы для WPF вы можете найти по адресу http://www.codeproject.com/ WPF/XamlUVSphere.asp). Дизайнерский же подход требует сложного программного обеспечения.
Предыдущая << 1 .. 392 393 394 395 396 397 < 398 > 399 400 401 402 403 404 .. 473 >> Следующая