Построение 3D объектов каркасным методом, с возможностью изменения точек наблюдения

                       МИНИСТЕРСТВО ОБРАЗОВАНИЯ И НАУКИ РОССИЙСКОЙ ФЕДЕРАЦИИ

       ФЕДЕРАЛЬНОЕ АГЕНТСТВО ПО ОБРАЗОВАНИЮЮЖНЫЙ ФЕДЕРАЛЬНЫЙ  УНИВЕРСИТЕТ

       ТЕХНОЛОГИЧЕСКИЙ ИНСТИТУТЮЖНОГО ФЕДЕРАЛЬНОГО УНИВЕРСИТЕТА В г. ТАГАНРОГЕ

 
 

       

 

       

 
 
 
 
 
 

       Курсовая  работа

       по  курсу «Компьютерная графика»

       на  тему: «Построение 3D объектов каркасным методом, с возможностью изменения точек наблюдения»

 
 
 

                    Выполнил:

                    студент группы ЗКС-529

                    Вихров М.Н.

 
 

                    Проверил:

                    ассистент кафедры САиТ

                    Вишняков  Р.Ю.

 
 
 

                                                                    Таганрог 2010

       ОГЛАВЛЕНИЕ

           

    ПОСТАНОВКА  ЗАДАЧИ

 

       Построение 3-мерных объектов каркасным методом, с возможностью изменения точек  наблюдения.

    ТЕОРЕТИЧЕСКАЯ ЧАСТЬ

    Трехмерные  преобразования

 

       Рассмотрим  трехмерную декартовую систему координат, являющуюся правосторонней. Примем соглашение, в соответствии с которым, будем считать положительными такие повороты, при которых (если смотреть с конца полуоси  в направлении начала координат) поворот на 90° против часовой стрелки будет переводить одну полуось в другую. На основе этого соглашения строится следующая таблица, которую можно использовать как для правых, так и для левых систем координат:

 
       Если ось вращения        Положительным будет направление поворота
    X     От  y  к  z
    Y     От  z  к  x
    Z     От  x  к  y
 

    

       Рис. 1 Трехмерная система координат

     

       Аналогично  тому, как точка на плоскости описывается  вектором (x,y), точка в трехмерном пространстве описывается вектором (x,y,z).

       Как и в двухмерном случае, для возможности реализаций трехмерных преобразований  с помощью матриц перейдем к однородным координатам:

 

       [x,y,z,1] или [X,Y,Z,H]

       [x*,y*,z*,1] = [ ], где Н¹1, ¹0

       Обобщенная  матрица преобразования 4´4 для трехмерных однородных координат имеет вид

 

        Т=

       Эта матрица может быть представлена в виде 4-х отдельных частей:

       

       Матрица 3´3 осуществляет линейное1 преобразование в виде изменения масштаба, сдвига и вращения.

       Матрица 1´3 производит перенос

       Матрица 3´1- преобразования в перспективе

       Скалярный элемент 1´1 выполняет общее изменение масштаба

 

       Рассмотрим  воздействие матрица 4´4 на однородный вектор [x,y,z,1]

 

       1) Трехмерный перенос – является простым расширением двумерного:

       T(Dx,Dy,Dz)=

       т.е. [x,y,z,1]*T(Dx,Dy,Dz)=[x+Dx,y+Dy,z+Dz,1]

 

       2) Трехмерное изменение масштаба

       Рассмотрим  частичное изменение масштаба. Оно реализуется следующим образом:

       S(Sx,Sy,Sz,)=

       т.е. [x,y,z,1]*S(Sx,Sy,Sz)=[Sx*x,Sy*y,Sz*z,1]

 

       Общее изменение масштаба получается за счет 4-ого диагонального элемента, т.е.:

 

       [x y z 1] * = [x y z S] = [x* y* z* 1] = [ ]

 

       Такой же результат можно получить при  равных коэффициентах частичных  изменений масштабов. В этом случае матрица преобразования такова:

        S=

 

       3) Трехмерный сдвиг

       Недиагональные элементы матрицы 3´3 осуществляют сдвиг в 3-х измерениях, т.е.

       [x y z 1]* =[x+yd+hz, bx+y+iz, cx+fy+z, 1]

       4) Трехмерное вращение

       Двухмерный поворот, рассмотренный ранее, является  в то же время трехмерным поворотом вокруг оси Z . В 3-х мерном пространстве поворот вокруг оси Z описывается матрицей

 

       Rz( )=

       Матрица поворота вокруг оси X имеет вид

       Rx( )=

       Матрица поворота вокруг оси Y имеет вид

          

       Ry( )=

       Результатом произвольной последовательности поворотов  вокруг осей x, y, z  является матрица

       А=

       Подматрицу 3´3 называют ортогональной, т.к. ее столбцы являются взаимно ортогональными един. векторами.

       Матрицы поворота сохраняют длину и углы, а матрицы масштабирования и  сдвига нет.

    Проекции

 

       В общем случае проекции преобразуют  точки, заданные в системе координат  размерностью  n, в системы координат размерностью меньше, чем  n.

       Будем  рассматривать случай проецирования 3 измерений в 2. Проекция трехмерного  объекта (представленного в виде совокупности точек) строится при помощи прямых проекционных лучей, которые  называются проекторами и которые проходят через каждую точку объекта и, пересекая картинную плоскость, образуют проекцию.

        Определенный таким образом класс проекций существует под названием плоских геометрических проекций, т. к. проецирование производится на плоскость, а не на искривленную поверхность и в качестве проекторов используется прямые, а не кривые линии.

       Многие  картографические проекции являются либо не плоскими, либо не геометрическими.

       Плоские геометрические проекции в дальнейшем будем называть просто проекциями.

       Проекции  делятся на два основных класса:

    • параллельные проекции (аксонометрические)
    • центральные проекции

        

       

       Рисунок 3 - Классификация проекций

       Параллельные проекции делятся на два типа в зависимости от соотношения между направлением проецирования и нормалью к проекционной плоскости.

    1. Ортографические – направления совпадают, т. е. направление проецирования является нормалью к проекционной плоскости.  
    2. Косоугольные – направление проецирования и нормаль к проекционной плоскости не совпадают.
 

       

       Рисунок 4 - Ортографические и косоугольные проекции

 

       Наиболее  широко используемыми видами ортографических  проекций является вид спереди, вид  сверху(план) и вид сбоку, в которых  картинная плоскость перпендикулярна главным координатным осям. Если проекционные плоскости не перпендикулярны главным координатным осям, то такие проекции называются аксонометрическими.

       При аксонометрическом проецировании  сохраняется параллельность прямых, а углы изменяются; расстояние можно  измерить вдоль каждой из главных координатных осей (в общем случае с различными масштабными коэффициентами).

       Изометрическая проекция – нормаль к проекционной плоскости (а следовательно и направление проецирование) составляют равные углы с каждой из главных координатных  осей. Если нормаль к проекционной плоскости имеет координаты (a,b,c), то потребуем, чтобы |a| = |b| = |c| или ±a=±b=±c, т. е. имеется 8 направлений (по одному в каждом из октантов), которые удовлетворяют этому условию. Однако существует лишь 4 различных изометрических проекции (если не рассматривать удаление скрытых линий), т.к. векторы (a, a, a) и (-a,-a,-a) определяют нормали к одной и той же проекционной плоскости.

       Изометрическая  проекция обладает следующим свойством: все 3 главные координатные оси одинаково укорачиваются. Поэтому можно проводить измерения вдоль направления осей с одним и тем же масштабом. Кроме того, главные координатные оси проецируются так, что их проекции составляют равные углы друг с другом (120°).

 

Рисунок 5 -  Изометрическая проекция единичного куба

 

       Косоугольные (наклонные) проекции сочетают в себе свойства ортографических проекций (видов спереди, сверху и сбоку) со свойствами аксонометрии. В этом случае проекционная плоскость перпендикулярна главной координатной оси, поэтому сторона объекта параллельная этой плоскости, проецируется так, что можно измерить углы и расстояния. Проецирование других сторон объекта также допускает проведение линейных измерений (но не угловых) вдоль главных осей. Отметим, что нормаль к проекционной плоскости и направление проецирование не совпадают.

       Двумя важными видами косоугольных проекций являются проекции:

       Кавалье (cavalier) – горизонтальная косоугольная изометрия (военная перспектива)

       Кабине (cabinet) – фронтальная косоугольная диметрия.

    

       Рисунок 6 -  Проекция Кавалье

       В проекции Кавалье направление проецирование составляет с плоскостью угол 45°. В результате проекция отрезка, перпендикулярного проекционной плоскости, имеет ту же длину, что и сам отрезок, т.е. укорачивание отсутствует.

 

    

       Рисунок 7 - Проекция Кабине

       Проекция  Кабине имеет направление проецирование, которое составляет с проекционной плоскостью угол = arctg(½) (≈26,5°). При этом отрезки, перпендикулярные проекционной плоскости, после проецирования составляют ½ их действительной длины. Проекции кабине являются более реалистическими, чем проекции Кавалье, т. к. укорачивание с коэффициентом ½ больше согласуются с нашим визуальным опытом.

       Центральная проекция любой совокупности параллельных прямых, которые не параллельны проекционной плоскости, будет сходиться в точке схода. Точек схода бесконечно много. Если совокупность прямых параллельна одной из главных координатных, осей, то их точка схода называется главной точкой схода. Имеются только 3 такие точки, соответствующие пересечениям главных координатных осей с проекционной плоскостью. Центральные проекции классифицируются в зависимости от числа главных точек схода, которыми они обладают, а, следовательно, и от числа координатных осей, которые пересекают проекционную плоскость.

       1) Одноточечная проекция.

    

       Рисунок 8 - Одноточечная перспектива

       2) Двухточечная проекция широко применяется в архитектурном, инженерном и промышленном проектировании.

    3) Трехточечные центральные проекции  почти совсем не используются, во-первых, потому, что их трудно  конструировать, а во-вторых, из-за  того, что они добавляют мало  нового с точки зрения реалистичности  по сравнению с двухточечной  проекцией.

    Математическое  описание плоских  геометрических проекций

 

       Каждую  из проекций можно описать матрицей 4´4. Этот способ оказывается удобным, поскольку появляется возможность объединить матрицу проецирования с матрицей преобразования.

       Центральная (перспективная) проекция получается путем перспективного преобразования и проецирования на некоторую двухмерную плоскость “наблюдения”. Перспективная проекция на плоскость Z = 0 обеспечивается преобразованием:

    [X Y Z H] = [x y z 1]* = [x y 0 (rz+1)]

    

       Рисунок 9 - Вычисление одноточечной перспективы

    или                  x* = = ;

                             y* = = ;

                             z* = = ;

       где r = ;

       Центр проекции находится в точке с  координатами. (0,0,-k), плоскость проецирования Z = 0. Соотношения между x, y и x*, y* остается тем же самым. Рассматривая подобные треугольники получим, что

        =       или      x* = ;  

       аналогично y* = .

       Координаты  x*, y* являются преобразованными координатами. В перспективном проектировании преобразованное пространство не является евклидовым, т.к. ортогональность осей не сохраняется. При k = ¥ получим аксонометрическое преобразование.

       Аффинное  преобразование есть комбинация линейных преобразований, сопровождаемых переносом     

       Последний столбец в обобщенной матрице 4´4 должен быть равен , в этом случае H = 1.

       Перспективному  преобразованию может предшествовать произвольная последовательность аффинных преобразований. Таким образом, чтобы получить перспективные изображения из произвольной точки наблюдения вначале используют аффинные преобразования, позволяющие сформировать систему координат с осью Z вдоль желаемой линии визирования. Затем применяется перспективное преобразование.

       Аналогично  перспективное преобразование когда картинная плоскость перпендикулярна оси Z и совпадает с плоскостью Z = 1/r. Центр проекции находится в центре координат.

       [X Y Z H] = [x y z 1] * = [x y z (rz+1)]  — одноточечная перспектива (точка схода Z).

         — точка схода X;

 
 

       Для того, чтобы создать диметрическую проекцию, необходимо выполнить следующие условие:  

             sin2φ=sin2θ/(1- sin2θ).

       Одним способом выбора sinθ является сокращение оси Z в фиксированное число раз. При этом единичный вектор на оси Z, равный [0 0 1 1], преобразовывается к виду:

       [X Y Z H] = [sinφ  -cosφsinθ    cosφcosθ  1]

       или     x* = sinφ

                  y*= - cosφ sinθ.

       Таким образом, для диметрической проекции получаем:

       φ = 20,705°

       θ = 22,208°

       Для образования изометрической проекции нужно в одинаковое число раз сократить все три оси. Для этого необходимо, чтобы выполнялось условие:

        sin2φ=sin2θ/(1- sin2θ)  и  sin2φ=(1-2sin2θ)/(1- sin2θ).

       Таким образом,

         φ = 35,26439°

         θ = 45°.

 

    АЛГОРИТМ  РЕШЕНИЯ ЗАДАЧИ

 

       Заданием  курсовой работы предусматривается  построение каркасного изображения  геометрических тел в параллельной и центральной проекциях. Как было показано в теоретической части понятие параллельной проекции не однозначно и необходимо определиться с тем видом проекции, которую мы будем использовать. В данной работе была выбрана аксонометрическая диметрическая проекция.

       Алгоритм решения задачи состоит из 3 этапов:

       1) Преобразование правой мировой системы координат в левую систему координат наблюдателя. Данное преобразование осуществляется умножение вектора координат точки на матрицу перестановки T.

       

       2) Поворот системы координат таким образом, чтобы положительное направление оси Oz совпадало с направлением вектора, проведенного из точки наблюдения в центр мировой системы координат. Данное преобразование описывается применением двух матриц поворота

       Rx(

)=
,

       Ry(

)=
.

 
 

       3) Выбор типа проецирования. В зависимости от выбора типа проецирования каждую координату объекта, преобразованную в пунктах 1 и 2 необходимо умножить на матрицы проецирования:

       для параллельного проецирования (аксонометрическая диметрическая проекция)

       

,

 
 
 

       для центрального проецирования

    

,

       где d - расстояние от проецируемо точки до центра проецирования.

 

       Первые  три этапа алгоритма уместно  преобразовать в один путем умножения  соответствующих матриц и получения  результирующей матрицы преобразования. Пусть точка наблюдения задана, как показано на рис 10.

 

    

    Рисунок 10

       Из  рисунка видно, что

    

    

    

    

       Тогда, подставив полученные выражения в матрицы поворота и, перемножив их с матрицей перенаправления  осей координат, получим результирующую матрицу P, которая преобразует координаты из мировой системы координат в систему координат, в которой точка наблюдения находится на оси Oz, причем направления наблюдения совпадает с положительным направлением этой оси.

 

    

.

       Умножив такую матрицу на произвольную точку  пространства, мы тем самым учитываем  положение точки наблюдения. Далее  действуем согласно алгоритму, умножая преобразованные координаты на соответствующую матрицу проецирования.

    ОПИСАНИЕ  ПРОГРАММЫ

    Системные требования

 

       Для нормальной работы программы необходимо:

 

       Процессор   Intel 8086/88 или любые более поздние модели

       Операционная  система Windows

       Монитор   любой цветной

    Руководство пользователя

 

       Навигации по программе осуществляется с помощью  меню пользователя, имеющего простой  и понятный интерфейс (а также можно изменять точку обзора непосредственно мышкой) на Рисунке 5.

 

       

 

       Рисунок 11 – Панель управления

       Первый  пункт позволяет в ходе работы динамически менять точку наблюдения, посредством задания ее вещественных координат в мировой системе  координат(Рисунок 6).

 
 

       

 

       Рисунок 12 – Точка обзора

 

       Второй  пункт меню позволяет менять проецируемое трехмерное геометрическое тело, осуществляя выбор между четырьмя фигурами (Рисунок 7).

 

       

 

       Рисунок 13 – Выбор фигуры

 
 

       Третий  пункт позволяет менять проекцию (Рисунок 8).

 

    

 

       Рисунок 14– Выбор проекции

 

       Кнопка  «показать» непосредственно выводит фигуру на дисплей (Рисунок 9).

     

 

       Рисунок 15 – Расчет фигуры

 

     

 

       Рисунок 16 – Пользовательский вид

    Листинг программы

         

unit Unit1;

 

interface

 

uses   Windows, Messages, SysUtils, Variants,

  Classes, Graphics, Controls, Forms,

  Dialogs, ExtCtrls, StdCtrls, Menus, ImgList,

  ComCtrls, mmSystem, Buttons;

type

point3d = record

        X,Y,Z:real;

        end;

type

  TForm1 = class(TForm)

    GroupBox1: TGroupBox;

    GroupBox2: TGroupBox;

    X_Edit: TEdit;

    Y_Edit: TEdit;

    Z_Edit: TEdit;

    Label1: TLabel;

    Label2: TLabel;

    Label3: TLabel;

    GroupBox3: TGroupBox;

    Fig_Kub: TRadioButton;

    Fig_Pir: TRadioButton;

    Fig_Pri: TRadioButton;

    Show_Button: TButton;

    GroupBox4: TGroupBox;

    Par_pro: TRadioButton;

    Cen_Pro: TRadioButton;

    Display: TImage;

    procedure Show_ButtonClick(Sender: TObject);

    procedure DisplayMouseDown(Sender: TObject; Button: TMouseButton;

      Shift: TShiftState; X, Y: Integer);

    procedure DisplayMouseMove(Sender: TObject; Shift: TShiftState; X,

      Y: Integer);

    procedure DisplayMouseUp(Sender: TObject; Button: TMouseButton;

      Shift: TShiftState; X, Y: Integer);

  private

  function sx(x:real):integer;

  function sy(y:real):integer;

  procedure trans_coord(wcoord, vcoord:point3D; var scoord:point3D);

  procedure parallel_projection(point, point_sight:point3D; var x,y:real);

  procedure central_projection(point, point_sight:point3D; var x,y:real);

  procedure Show_central_projection;

  procedure Show_parallel_projection;

    { Private declarations }

  public

    { Public declarations }

  end;

 
 
Построение 3D объектов каркасным методом, с возможностью изменения точек наблюдения