Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Turbo Pascal / Методические указание / Синтез графических образов простыми средствами.DOC
Скачиваний:
17
Добавлен:
15.06.2014
Размер:
205.82 Кб
Скачать

6 Синтез простых трехмерных динамических образов

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

Задается скорость по оси Z(speed) для набора пикселей. Если какой-либо пиксель выходит из зоны видимости, то для него генерируются новые координаты в дальней части зоны видимости, моделируя перемещение наблюдателя относительно бесконечного набора пикселей. Цвет пикселей по мере приближения ( уменьшения координатыZ) становится более ярким.

{--------------------------------------------------------------------------------------

"Межзвездный полет" -

перспективная проекция движущегося трехмерного образа.

---------------------------------------------------------------------------------------}

uses crt,graph;

const N=100; { число звезд }

view=200; { дистанция просмотра }

speed=50; { скорость полета }

var x,y,z,_x,_y,color: array[1..N] of integer;

i,gm,gd,gx,gy,xc,yc :integer;

speed

begin randomize;

for i:=1 to N do begin

{ установка начальных координат звезд }

x[i]:=-10*view +random(20*view);

y[i]:=-10*view +random(20*view);

z[i]:= view +random(20*view)

end;

Z

gd:=0; initgraph(gd,gm,'');

xc:=GetmaxX div 2; экран

yc:=GetmaxY div 2; Y X view

REPEAT Рисунок 1

{ Расчет перспективных проекций звезд и их вывод }

for i:=1 to N do

{ если проекция звезды в пределах экрана }

if( z[i]/(abs(x[i])+1) > view/xc)

and( z[i]/(abs(y[i])+1) > view/yc)

then begin

{ вычисление координат с учетом перспективы }

_x[i]:=xc +round( x[i]*(view/z[i]));

_y[i]:=yc +round( y[i]*(view/z[i]));

putpixel(_x[i],_y[i],color[i]) end

else

{ для вышедших из поля зрения звезд переназначаем координаты }

z[i]:=view +random(20*view);

delay(50); { задержка видимости набора звезд }

for i:=1 to N do begin

dec( z[i], speed); { смена координат звезд }

{ цвет зависит от дальности }

if z[i]<4*view then color[i]:=14

else if z[i]<9*view then color[i]:=11

else color[i]:= 9 end;

{ стирание по старым координатам }

for i:=1 to N do putpixel(_x[i],_y[i],0);

until KeyPressed; CloseGraph END.

7 Практическое задание по модификации алгоритма

"Межзвездный полет"

7.1 Смоделировать различные типы обзора при "движении среди звезд": боковой, задний, под определенным углом к направлению

движения.

7.2 Смоделировать вращение вокруг одной из осей координат

при движении.

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