Аксонометрическая проекция
Одна ортографическая проекция не может дать представления об общей трехмерной форме объекта. Это ограничение можно преодолеть с помощью аксонометрических проекций. Аксонометрическая проекция образуется манипулированием объекта с помощью поворотов и перемещений. Результат затем проецируется с центром проекции, расположенным в бесконечности, на одну из координатных плоскостей, обычно на плоскость z — 0. Если грань не параллельна плоскости проекции, то аксонометрическая проекция не показывает истинную форму этой грани. Однако остаются постоянными относительные длины параллельных в исходном пространстве линий, т. е. параллельные линии одинаково укорачиваются (искажаются). Коэффициент искажения есть отношение длины проекции отрезка к его истинной длине. Программная реализация: Создаем матрицу и затем делаем преобразование M_aks[0, 0] = Math.Cos(psi); M_aks[0, 1] = Math.Sin(fi) * Math.Sin(psi); M_aks[1, 1] = Math.Cos(fi); M_aks[2, 0] = Math.Sin(psi); M_aks[2, 1] = -Math.Sin(fi) * Math.Cos(psi); M_aks[2, 2] = 0; Preobrazovanie(cylinderP, M_aks), Preobrazovanie(coneP, M_aks)
угол psi - угол между осью х и осью z; угол fi - угол между осью y и осью z; Рис. 3.2. Аксонометрическая проекция Косоугольная проекция В противоположность ортографическим и аксонометрическим проекциям, для которых проекторы перпендикулярны плоскости проекции, косоугольная проекция формируется параллельными проекторами с центром, лежащим в бесконечности, ирасположенными под косым углом к плоскости проекции. Косоугольные проекции показывают общую трехмерную форму объекта. Однако истинные размер и форма изображаются только для граней объекта, расположенных параллельно плоскости проекции, т.е. углы и длины сохраняются только для таких граней. Грани, не параллельные плоскости проекции, подвергаются искажению.
Особый интерес представляют две косоугольные проекции — Кавалье и Кабине. Проекция Кавалье получается, когда угол между проекторами и плоскостью проекции составляет 45°. В этой проекции коэффициенты искажения для всех трех главных направлений одинаковы. Результат этой проекции выглядит неестественно утолщенным. Для «коррекции» этого недостатка используется проекция Кабине. Проекцией Кабине называется такая косоугольная проекция, у которой коэффициент искажения для ребер, перпендикулярных плоскости проекции, равен 1/2. Таким образом, преобразование для косоугольной проекции имеет вид: Наиболее часто используются значения для угла равны 30° и 40°. Поскольку изображается истинная форма одной грани, косоугольные проекции особенно подходят для иллюстрации объектов с круглыми или иными искривленными гранями. Такие грани должны быть параллельны плоскости проекции, чтобы избежать нежелательных искажений. Так же, как и в случае параллельных проекций, объекты с одним измерением, существенно превосходящим другие, подвергаются значительному искажению, если только это измерение не параллельно плоскости проекции. Программная реализация: Создаем матрицу и затем делаем преобразование M_kos[2, 0] = l * Math.Cos(alfa); M_kos[2, 1] = l * Math.Sin(alfa); M_kos[2, 2] = 0; Preobrazovanie(cylinderP, M_kos), Preobrazovanie(coneP, M_kos)
L - длина проекции единичного отрезка; угол alfa - угол между осью x и осью z. Рис. 3.3. Косоугольная проекция Перспективная проекция Перспективное преобразование имеет место, когда не равен нулю любой из первых трех элементов четвертого столбца обобщенной (4 х 4)-матрицы преобразования однородных координат. В отличие от обсуждавшихся ранее параллельных преобразований, в данном случае параллельные прямые сходятся, размер объекта уменьшается с увеличением расстояния до центра проекции, и происходит неоднородное искажение линий объекта, зависящее от ориентации и расстояния от объекта до центра проекции. Все это помогает нашему восприятию глубины, но не сохраняет форму объекта.
Перспективное одноточечное преобразование задается равенством Обычные координаты получаются делением на z/d: d - расстояние до плоскости проецирования; ƍ - расстояния от точки зрения до объекта; Рис. 3.4. Перспективная проекция Программная реализация: Создаем матрицу и затем делаем преобразование //--------------------------- Видовое преобоазование double teta = int.Parse(tb_teta.Text) * Math.PI / 180; double fi = int.Parse(tb_fi.Text) * Math.PI / 180; double ro = int.Parse(tb_Ro.Text); V[0, 0] = -Math.Sin(teta); V[0, 1] = -Math.Cos(fi) * Math.Cos(teta); V[0, 2] = -Math.Sin(fi) * Math.Cos(teta); V[1, 0] = Math.Cos(teta); V[1, 1] = -Math.Cos(fi) * Math.Sin(teta); V[1, 2] = -Math.Sin(fi) * Math.Sin(teta); V[2, 1] = Math.Sin(fi); V[2, 2] = -Math.Cos(fi); V[3, 2] = ro; //====================================== Перспективное преобразование double d = int.Parse(numericUpDown_d.Value.ToString()); M_per[2, 3] = 1 / d; M_per[3, 3] = 0;
Preobrazovanie_per(cylinderP, umnozhen(V, M_per)), Preobrazovanie_per(coneP, umnozhen(V, M_per))
Перемножаем матрицы видового и перспективного преобразования, затем делаем преобразование результирующей матрицей. public MyPoints[] Preobrazovanie_per(MyPoints[] A, double[,] B)// { double d = int.Parse(numericUpDown_d.Value.ToString()); MyPoints[] C = new MyPoints[A.Length]; for (int i = 0; i < A.Length; i++) { double[,] buf = new double[1, 4]; buf[0, 0] = A[i].x; buf[0, 1] = A[i].y; buf[0, 2] = A[i].z; buf[0, 3] = 1; buf = umnozhen(buf, B); if (buf[0, 2]!= 0) { C[i].x = buf[0, 0] * d / buf[0, 2]; C[i].y = buf[0, 1] * d / buf[0, 2]; C[i].z = d; } } return C; }
Удаление невидимых линий Задача удаления невидимых линий и поверхностей является одной из наиболее сложных в машинной графике. Рис. 3.3. Удаление невидимых линий В данное работе используется метод «художника» (классический). Метод «художника» понятен и прост в реализации, а с учетом геометрии объектов и их количества не требует больших расчетов и много аппаратной мощности, от куда следует и быстрота в работе. Для каждого положения объекта я сортирую общий массив полигонов двух объектов по среднему Z для каждого полигона. Сортировка идет по следующему принципу: если средняя координата Z первого полигона больше средней координаты Z второго полигона, то следовательно первый объект находится дальше от камеры и рисуется первым. При рисовке все полигоны закрашиваются определенным цветом. Из вышесказанного следует, что последние отрисованные полигоны закрашивают нарисованные первые полигоны и грани. Это облегчает работу при прорисовке двух объектов.
Программная реализация: В зависимости от вида проекции сортировка производиться по среднему значению необходимой координаты. При виде спереди сортировка производится по z. При виде сбоку сортировка производится по x. При виде сверху сортировка производится по у. Для перспективной проекции без видового преобразования сортировка производится по z, а с видовым преобразование сортировка производится в обратном порядке по z. Для аксонометрии и косоугольной проекций сортировка производится по z, но в зависимости от углов в сортировку добавляются различные изменения. Среднее значение координат плоскости находится с помощью функции average(Faces A, int koord). Входные параметры это непосредственно сама грань и флаг определяющий среднее значение какой координаты вычислять. public double average(Faces A, int koord) { double znach = 0; int kol = 0; foreach (MyPoints point3 in A.Points) { if (koord == 1) znach += point3.x; if (koord == 2) znach += point3.y; if (koord == 3) znach += point3.z; kol++; } znach = znach / kol; return znach; } Далее простой функцией сортируем по необходимой координате, в зависимости от вида проекции. Затем отображаем поочередно грани.
Воспользуйтесь поиском по сайту: ©2015 - 2024 megalektsii.ru Все авторские права принадлежат авторам лекционных материалов. Обратная связь с нами...
|